2016-03-01 22 views
0

我一直在尝试基于一列过滤出重复行。基于一列选择重复行之一

SELECT DISTINCT 
    a.id, 
    b.name, 
    b.number 
FROM 
    b 
LEFT JOIN a 
    ON a.name = b.name 
ORDER BY 
    b.name 
ASC; 

,其结果是:

id,name,number 
1 Bob NULL 
1 Bob 100 
2 Bob NULL 
2 Bob 200 
3 Bob NULL 
3 Bob 300 
4 Bob 400 

我想达到的效果是这样的:

id,name,number 
1 Bob 100 
2 Bob 200 
3 Bob 300 
4 Bob 400 
+1

其中[编号]不为空 – mxix

+0

你是不是想过滤掉'null'值还是想在'number'字段上执行聚合?如果返回2个非空数字会怎么样? – sgeddes

+0

如果有两行具有相同的ID,并且有一个具有该数字,我想选择该行。但是,如果有两行包含NULL数字,请选择null。还有其他非重复行的值为NULL,所以我希望他们保持这种状态。 – Kyle

回答

0

可以以选择性地滤除NULL值使用ROW_NUMBERb.number字段:

SELECT id, name, number 
FROM (
    SELECT a.id, b.name, b.number, 
     ROW_NUMBER() OVER (ORDER BY COALESCE(b.number, -1) DESC) AS rn 
    FROM b 
    LEFT JOIN a ON a.name = b.name) AS t 
    WHERE t.rn = 1 
ORDER BY name ASC 

以上查询仅处理带有一个或最多两行的案例,每个案例为id,其中一个或两个案例均为NULL

0

如果你想在NULL值相结合,我建议汇总:

SELECT a.id, b.name, SUM(b.number) as number 
FROM b LEFT JOIN 
    a 
    ON a.name = b.name 
GROUP BY a.id, b.name; 

或者,只用一个WHERE条款:

SELECT a.id, b.name, b.number 
FROM b LEFT JOIN 
    a 
    ON a.name = b.name 
WHERE b.name IS NOT NULL;