[英]A complex group by SQL query
假设您参加抽奖可以获得免费汽车。 要参与,您需要提供姓名、地址、电话号码和电子邮件。 参加抽奖只需要不同的电子邮件。 超过100,000人参加了抽奖。 他们中的许多人使用了 2 或 3 封不同的电子邮件,但使用了相同的姓名、地址和电话号码。 编写一个查询,告诉我表中有多少重复项。 我的情况与此类似。
这是表格格式
RecID Name Address Phone email
假设所有记录都是 nvarchar,除了是 int 的 RecID。 还假设提供了所有字段。 当需要 3 列匹配时,我不知道如何使用 group by。
SELECT Name, Address, Phone, COUNT(*) as NumEntries
FROM YourTable
GROUP BY Name, Address, Phone
HAVING COUNT(*) > 1 /* Duplicates exist */
而且,如果您还希望包含各个电子邮件地址:
SELECT t.Name, t.Address, t.Phone, t.email, q.NumEntries
FROM YourTable t
INNER JOIN (SELECT Name, Address, Phone, COUNT(*) as NumEntries
FROM YourTable
GROUP BY Name, Address, Phone
HAVING COUNT(*) > 1 /* Duplicates exist */) q
ON t.Name = q.Name
AND t.Address = q.Address
AND t.Phone = q.Phone
ORDER BY t.Name, t.Address, t.Phone, t.email
您只需在GROUP BY
使用所有应该相同的字段即可:
SELECT Name, Address, Phone, Count(*)
from MyTAble
GROUP BY Name, Address, Phone
HAVING Count(*) > 1
返回的记录是具有重复项的那些“名称”,“地址”,“电话”组合。 重复数是所有Count(*)的总数减去查询返回的记录数(因为从技术上讲,这些组中的每一个都不是重复项,而其余则不是重复项)。
假设表的列名 Name as PART_NAME PHONE Number as PART_NAME select d.*, COUNT(PART_NAME) OVER(PARTITION BY PART_NAME,PHONE_NUMBER) FROM draw d
SELECT *
FROM table
WHERE Phone IN
( SELECT Phone
FROM table
GROUP BY Name, Address, Phone
WHERE COUNT(Name) > 1
) AS A
这应该为您获得每重复的整个行。
您可以将ORDER BY Name, Address, Phone
到外部查询中,以确保重复项彼此相邻。
“当心上面代码中的错误;我只是证明了它是正确的,没有尝试过。” -唐纳德·努斯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.