I SQL Server fra og med version 2005 og nyere kan du bruge en CTE (Common Table Expression) med ROW_NUMBER
funktion til at eliminere dubletter:
;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
Denne CTE "opdeler" dine data efter BrugerID
, og for hver partition, ROW_NUMBER
funktionen uddeler fortløbende numre, startende ved 1 og sorteret efter Created DESC
- så den seneste række får RowNum =1
(for hver BrugerID
), hvilket er det, jeg vælger fra CTE i SELECT-sætningen efter den.
Ved at bruge den samme CTE kan du også nemt slette dubletter:
;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
Samme princip gælder:du "grupperer" (eller opdeler) dine data efter nogle kriterier, du nummererer fortløbende alle rækkerne for hver datapartition, og dem med værdier større end 1 for det "opdelte rækkenummer" luges ud af