我有个人表:
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)
如果您的街道空白(如空集''或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