Как лучше всего определять повторяющиеся записи в таблице SQL Server?
Например, я хочу найти последний полученный дубликат электронного письма в таблице (таблица имеет поля первичного ключа, полученную дату и адрес электронной почты).
Пример данных:
1 01/01/2008 [email protected]
2 02/01/2008 [email protected]
3 01/12/2008 [email protected]


Не могли бы вы присоединиться к списку в поле электронной почты, а затем посмотреть, какие нули вы получите в своем результате?
Или еще лучше, посчитайте экземпляры каждого адреса электронной почты? И возвращать только те, у которых count> 1
Или даже возьмите поля электронной почты и идентификатора. И верните записи, где e-mail такой же, а идентификаторы разные. (Чтобы избежать дублирования, не используйте! =, А либо <или>.)
что-то вроде этого
select email ,max(receiveddate) as MaxDate
from YourTable
group by email
having count(email) > 1
Попробуй это
select * from table a, table b
where a.email = b.email
SELECT [id], [receivedate], [email]
FROM [mytable]
WHERE [email] IN ( SELECT [email]
FROM [myTable]
GROUP BY [email]
HAVING COUNT([email]) > 1 )
Хотите список последних предметов? Если да, вы можете использовать:
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
Если у вас есть суррогатный ключ, относительно легко использовать группировку по синтаксису, упомянутую в сообщении 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
)
Попробуйте что-нибудь вроде:
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/