2013-06-12 84 views
0

我有一個人表:選擇重複記錄信息

Phone  | Id1 | Id2 | Fname | Lname| Street 
111111111 | A1 | 1000 | David | Luck | 123 Main Street 
111111111 | A2 | 1001 | David | Luck | blank 
111111111 | A3 | 1002 | David | Luck | blank 
222222222 | B1 | 2000 | Smith | Nema | blank 
333333333 | C1 | 3000 | Lanyn | Buck | 456 Street 

我想有以下結果:

Phone  | Id1 | Id2 | Fname | Lname| Street 
111111111 | A1 | 1000 | David | Luck | 123 Main Street 
222222222 | B1 | 2000 | Smith | Nema | blank 
333333333 | C1 | 3000 | Lanyn | Buck | 456 Street 

什麼SQL2008查詢我應該使用挑DUP 電話有街道信息的記錄?由於

+0

它們是空白的「',還是空白的'空白'? –

回答

0

你想選擇一個特定的行。這是窗口功能row_number()最有用的地方。面臨的挑戰是找到正確order by子句:

select p.Phone, p.Id1, p.Id2, p.Fname, p.Lname, p.Street 
from (select p.*, 
      row_number() over (partition by phone 
           order by (case when street is not null then 0 else 1 end), 
             id2 
           ) as seqnum 
     from person p 
    ) p 
where seqnum = 1 

功能row_number()分配一個序列號,與phone相同的值(基於partition by子句)行。非空白街道和最低id2的值得到1的值。如果不存在,則具有最低的id2的值獲得該值。這是由外部過濾器選擇的那個。

-1

試試這個

select a.* from Table1 a 
inner join 
(
    select distinct Phone from Table1 
    group by Phone 
) as b 
on a.Phone= b.Phone 
+0

這將輸出Table1中的每個記錄,另外DISTINCT和GROUP BY是多餘的。 –

0

如果您的街道是空白的(如空集「」或NULL)時,不是與實際地址居住,你可以用它來得到結果:

SELECT a.* 
FROM Person a 
JOIN (SELECT Phone, MAX(Street)'Street' 
     FROM Person 
     GROUP BY Phone 
    )b 
ON a.Phone = b.Phone 
AND a.Street = b.Street 

演示:SQL Fiddle

如果街道是字面字符串「空白」,那麼上面不會返回預期的結果。

+0

感謝@Goat_CO,街道值爲空(空白)或NULL。 – tkvo

+0

然後MAX()將工作得很好。 –

0
SELECT a.* 
FROM person a 
JOIN (SELECT Phone, Street, 
     ROW_NUMBER() OVER (PARTITION BY Phone 
     ORDER BY CASE WHEN street is null then 0 else 1 end) as 'Rank' 
     FROM Person 
    )b 
ON a.Phone = b.Phone 
AND a.Street = b.Street 
WHERE b.Rank = 1