2013-06-12 86 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