Проверка дубликатов SQL Server

Как лучше всего определить повторяющиеся записи в таблице SQL Server?

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

Образец данных:

1  01/01/2008 [email protected]
2  02/01/2008 [email protected]
3  01/12/2008 [email protected]

person Community    schedule 05.09.2008    source источник


Ответы (6)


что-то вроде этого

select email ,max(receiveddate) as MaxDate
from YourTable
group by email 
having count(email) > 1
person SQLMenace    schedule 05.09.2008

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

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/

person user2051770    schedule 07.02.2013

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

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

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

person Rob Rolnick    schedule 05.09.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

Если вам нужен последний дубликат электронного письма (один результат), вы просто добавляете «ТОП 1» и «ЗАКАЗАТЬ ПО»:

SELECT TOP 1 [info] FROM [table] GROUP BY [email] HAVING Count(*) > 1 ORDER BY Date DESC
person enigmatic    schedule 05.09.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
)
person Brian    schedule 05.09.2008

Попробуй это

select * from table a, table b
where a.email = b.email
person Michael Sharek    schedule 05.09.2008