簡體   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