Выявление дубликатов записей в SQL вместе с первичным ключом - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть бизнес-сценарий, в котором мне нужно просмотреть таблицу SQL «Пользователи», чтобы найти дублирующиеся адреса электронной почты.Я смог сделать это по следующему запросу:

SELECT
    user_email, COUNT(*) as DuplicateEmails
FROM
    Users
GROUP BY
    user_email
HAVING 
    COUNT(*) > 1
ORDER BY 
    DuplicateEmails DESC

Я получаю вывод, подобный этому:

user_email      DuplicateEmails  
--------------------------------
abc@gmail.com   2
xyz@yahoo.com   3

Теперь меня просят перечислить все дублирующиеся записи в однойсобственный ряд и отображать некоторые дополнительные свойства, такие как имя, фамилия и идентификатор пользователя.Вся эта информация хранится в этой таблице «Пользователи».У меня трудности с этим.Кто-нибудь может мне помочь или направить меня в правильном направлении?

Мой вывод должен выглядеть так:

    user_email      DuplicateEmails  FirstName      LastName       UserID
    ------------------------------------------------------------------------------
    abc@gmail.com   2                Tim            Lentil         timLentil
    abc@gmail.com   2                John           Doe            johnDoe12
    xyz@yahoo.com   3                brian          boss           brianTheBoss
    xyz@yahoo.com   3                Thomas         Hood           tHood
    xyz@yahoo.com   3                Mark           Brown          MBrown12

Ответы [ 5 ]

0 голосов
/ 21 сентября 2018

Я думаю, это тоже будет работать.

WITH cte (
     SELECT
         * 
         ,DuplicateEmails = ROW_NUMBER() OVER (Partition  BY user_email ORder by user_email)
    FROM Users
    )
    Select * from CTE 
    where DuplicateEmails > 1
0 голосов
/ 21 сентября 2018

Используйте функцию окна следующим образом:

SELECT u.*
FROM (SELECT u.*, COUNT(*) OVER (PARTITION BY user_email) as numDuplicateEmails
      FROM Users
     ) u
WHERE numDuplicateEmails > 1
ORDER BY numDuplicateEmails DESC;
0 голосов
/ 21 сентября 2018

Использование count() over( Partition by ), пример

0 голосов
/ 21 сентября 2018

Вы можете решить это как:

DECLARE @T TABLE
(
    UserID VARCHAR(20),
    FirstName NVARCHAR(45),
    LastName NVARCHAR(45),
    UserMail VARCHAR(45)
);

INSERT INTO @T (UserMail, FirstName, LastName, UserID) VALUES    
('abc@gmail.com', 'Tim',         'Lentil',         'timLentil'),
('abc@gmail.com', 'John',         'Doe',         'johnDoe12'),
('xyz@yahoo.com', 'brian',         'boss',         'brianTheBoss'),
('xyz@yahoo.com', 'Thomas',         'Hood',         'tHood'),
('xyz@yahoo.com', 'Mark',         'Brown',         'MBrown12');

SELECT *, COUNT (1) OVER (PARTITION BY UserMail) MailCount
FROM @T;

Результаты:

+--------------+-----------+----------+---------------+-----------+
|    UserID    | FirstName | LastName |   UserMail    | MailCount |
+--------------+-----------+----------+---------------+-----------+
| timLentil    | Tim       | Lentil   | abc@gmail.com |         2 |
| johnDoe12    | John      | Doe      | abc@gmail.com |         2 |
| brianTheBoss | brian     | boss     | xyz@yahoo.com |         3 |
| tHood        | Thomas    | Hood     | xyz@yahoo.com |         3 |
| MBrown12     | Mark      | Brown    | xyz@yahoo.com |         3 |
+--------------+-----------+----------+---------------+-----------+
0 голосов
/ 21 сентября 2018

Есть несколько способов сделать это.Вот один, использующий cte.

with FoundDuplicates as
(
    SELECT
         uter_email, COUNT(*) as DuplicateEmails
    FROM
        Users
    GROUP BY
         uter_email
    HAVING 
        COUNT(*) > 1
)

select fd.user_email
    , fd.DuplicateEmails  
    , u.FirstName      
    , u.LastName       
    , u.UserID
from Users u
join FoundDuplicates fd on fd.uter_email = u.uter_email
ORDER BY fd.DuplicateEmails DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...