Проверка дубликатов SQL Server - PullRequest
4 голосов
/ 06 сентября 2008

Каков наилучший способ определить дубликаты записей в таблице SQL Server?

Например, я хочу найти последнее дублированное электронное письмо, полученное в таблице (таблица имеет поля первичного ключа, receivedate и email).

Пример данных:

1  01/01/2008 stuff@stuff.com
2  02/01/2008 stuff@stuff.com
3  01/12/2008 noone@stuff.com

Ответы [ 7 ]

9 голосов
/ 06 сентября 2008

как то так

select email ,max(receiveddate) as MaxDate
from YourTable
group by email 
having count(email) > 1
1 голос
/ 07 февраля 2013

Попробуйте что-то вроде:

SELECT * FROM (
  SELECT *, 
  ROW_NUMBER() OVER (PARTITION BY ReceivedDate, Email ORDER BY ReceivedDate, Email DESC) AS RowNumber 
  FROM EmailTable
) a
WHERE RowNumber = 1

См. http://www.technicaloverload.com/working-with-duplicates-in-sql-server/

0 голосов
/ 06 сентября 2008

Если у вас есть суррогатный ключ, относительно просто использовать группу по синтаксису, упомянутому в посте SQLMenance По сути, группируйте по всем полям, которые делают две или более строки «одинаковыми».

Пример псевдокода для удаления повторяющихся записей.

Create table people (ID(PK), Name, Address, DOB)

Delete from people where id not in (
Select min(ID) from people group by name, address, dob
)
0 голосов
/ 06 сентября 2008

Хотите список последних предметов? Если это так, вы можете использовать:

SELECT [info] FROM [table] t WHERE NOT EXISTS (SELECT * FROM [table] tCheck WHERE t.date > tCheck.date)

Если вы хотите получить список всех дублирующих адресов электронной почты, используйте GROUP BY для сбора похожих данных, а затем предложение HAVING, чтобы убедиться, что количество превышает 1:

SELECT [info] FROM [table] GROUP BY [email] HAVING Count(*) > 1 DESC

Если вы хотите получить последний дубликат электронной почты (один результат), просто добавьте «TOP 1» и «ORDER BY»:

SELECT TOP 1 [info] FROM [table] GROUP BY [email] HAVING Count(*) > 1 ORDER BY Date DESC
0 голосов
/ 06 сентября 2008
SELECT [id], [receivedate], [email]
FROM [mytable]
WHERE [email] IN ( SELECT [email]
    FROM [myTable]
    GROUP BY [email]
    HAVING COUNT([email]) > 1 )
0 голосов
/ 06 сентября 2008

Попробуйте это

select * from table a, table b
where a.email = b.email
0 голосов
/ 06 сентября 2008

Не могли бы вы присоединиться к списку в поле электронной почты, а затем посмотреть, какие пустые значения вы получите в результате?

Или, еще лучше, подсчитать количество экземпляров каждого адреса электронной почты? И возвращайте только те, у которых количество> 1

Или даже взять адрес электронной почты и поля идентификатора. И вернуть записи, где электронная почта одинакова, а идентификаторы разные. (Чтобы избежать дубликатов, не используйте! =, А вместо этого <или>.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...