In SQL Server ab Version 2005 und neuer können Sie einen CTE (Common Table Expression) mit der ROW_NUMBER
verwenden Funktion zum Entfernen von Duplikaten:
;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
Dieser CTE "partitioniert" Ihre Daten nach UserID
, und für jede Partition die ROW_NUMBER
Funktion gibt fortlaufende Nummern aus, beginnend bei 1 und sortiert nach Created DESC
- die letzte Zeile erhält also RowNum = 1
(für jede UserID
), was ich aus dem CTE in der SELECT-Anweisung danach auswähle.
Mit demselben CTE können Sie Duplikate auch einfach löschen:
;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
Es gilt das gleiche Prinzip:Sie "gruppieren" (oder partitionieren) Ihre Daten nach bestimmten Kriterien, Sie nummerieren fortlaufend alle Zeilen für jede Datenpartition, und diejenigen mit Werten größer als 1 für die "partitionierte Zeilennummer" werden durch den DELETE
.