W SQL Server od wersji 2005 i nowszych można użyć CTE (Common Table Expression) z ROW_NUMBER
funkcja eliminacji duplikatów:
;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
To CTE „partycjonuje” Twoje dane według UserID
, a dla każdej partycji ROW_NUMBER
funkcja rozdaje kolejne numery, zaczynając od 1 i uporządkowane przez Created DESC
- więc najnowszy wiersz otrzymuje RowNum = 1
(dla każdego UserID
), który wybieram z CTE w poleceniu SELECT po nim.
Korzystając z tego samego CTE, możesz również łatwo usuwać duplikaty:
;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
Obowiązuje ta sama zasada:„grupujesz” (lub partycjonujesz) dane według pewnych kryteriów, kolejno numerujesz wszystkie wiersze dla każdej partycji danych, a te z wartościami większymi niż 1 dla „numeru wiersza partycjonowanego” są usuwane przez DELETE
.