Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

group_concat in SQL Server 2008

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 .