2016-03-01 20 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;