В SQL Server от версия 2005 и по-нова можете да използвате CTE (общ табличен израз) с ROW_NUMBER
функция за премахване на дубликати:
;WITH LastPerUser AS
(
SELECT
ID, UserID, ClassID, SchoolID, Created,
ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum'
FROM dbo.YourTable
)
SELECT
ID, UserID, ClassID, SchoolID, Created,
FROM LastPerUser
WHERE RowNum = 1
Този CTE "разделя" вашите данни по UserID
и за всеки дял, ROW_NUMBER
функцията раздава последователни числа, започващи от 1 и подредени по Created DESC
- така че последният ред получава RowNum = 1
(за всеки UserID
), което избирам от CTE в оператора SELECT след него.
Използвайки същия CTE, можете лесно да изтриете дубликати:
;WITH LastPerUser AS
(
SELECT
ID, UserID, ClassID, SchoolID, Created,
ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum'
FROM dbo.YourTable
)
DELETE FROM dbo.YourTable t
FROM LastPerUser cte
WHERE t.ID = cte.ID AND cte.RowNum > 1
Прилага се същият принцип:вие „групирате“ (или разделяте) данните си по някакъв критерий, номерирате последователно всички редове за всеки дял от данни, а тези със стойности, по-големи от 1 за „номера на разделения ред“, се отстраняват от DELETE
.