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 查询来选择具有街道信息的重复电话记录?谢谢

4

4 回答 4

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 小提琴

如果您的街道实际上是字符串“空白”,那么上面的内容不会返回所需的结果。

于 2013-06-12T18:06:57.390 回答
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 的街道获得值。那是外部过滤器选择的那个。

于 2013-06-12T18:23:10.423 回答
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
于 2013-06-12T18:33:41.097 回答
-1

尝试这个

select a.* from Table1 a
inner join 
(
   select distinct Phone  from Table1
   group by Phone
) as b
on a.Phone= b.Phone
于 2013-06-12T18:04:41.710 回答