I SQL Server från och med version 2005 och senare kan du använda en CTE (Common Table Expression) med ROW_NUMBER
funktion för att eliminera dubbletter:
;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
Denna CTE "partitionerar" dina data med Användar-ID
, och för varje partition, ROW_NUMBER
funktionen delar ut sekventiella nummer, som börjar på 1 och sorteras efter Created DESC
- så den senaste raden får RowNum =1
(för varje Användar-ID
) vilket är vad jag väljer från CTE i SELECT-satsen efter den.
Med samma CTE kan du också enkelt ta bort dubbletter:
;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
Samma princip gäller:du "grupperar" (eller partitionerar) dina data efter vissa kriterier, du numrerar i följd alla rader för varje datapartition, och de med värden större än 1 för det "partitionerade radnumret" såras bort av