Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

group_concat in SQL Server 2008

In SQL Server a partire dalla versione 2005 e successive, puoi utilizzare un CTE (Common Table Expression) con il ROW_NUMBER funzione per eliminare i duplicati:

;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

Questo CTE "partiziona" i tuoi dati in base a UserID e per ogni partizione, il ROW_NUMBER la funzione distribuisce numeri sequenziali, a partire da 1 e ordinati per Created DESC - quindi l'ultima riga ottiene RowNum = 1 (per ogni UserID ) che è ciò che seleziono dal CTE nell'istruzione SELECT dopo di esso.

Utilizzando lo stesso CTE, puoi anche eliminare facilmente i duplicati:

;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

Si applica lo stesso principio:"raggruppi" (o partiziona) i tuoi dati in base ad alcuni criteri, numeri consecutivamente tutte le righe per ciascuna partizione di dati e quelle con valori maggiori di 1 per il "numero di riga partizionata" vengono eliminate dal DELETE .