选择重复记录信息

时间:2013-06-12 17:55:29

标签: sql sql-server-2008 duplicates

我有个人表:

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 手机记录?谢谢

4 个答案:

答案 0 :(得分: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

如果您的街道字面意思是“空白”字符串,则上述内容不会返回所需的结果。

答案 1 :(得分: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最低的那个获取值。这是外部过滤器选择的那个。

答案 2 :(得分: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

答案 3 :(得分:-1)

试试这个

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