繁体   English   中英

一个复杂的 group by SQL 查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM