Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

group_concat dans SQL Server 2008

Dans SQL Server à partir de la version 2005 et plus récente, vous pouvez utiliser un CTE (Common Table Expression) avec le ROW_NUMBER fonction pour éliminer les doublons :

;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

Ce CTE "partitionne" vos données par UserID , et pour chaque partition, le ROW_NUMBER la fonction distribue des numéros séquentiels, commençant à 1 et classés par Created DESC - donc la dernière ligne obtient RowNum = 1 (pour chaque UserID ) qui est ce que je sélectionne dans le CTE dans l'instruction SELECT après.

En utilisant le même CTE, vous pouvez également facilement supprimer les doublons :

;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

Le même principe s'applique :vous "regroupez" (ou partitionnez) vos données selon certains critères, vous numérotez consécutivement toutes les lignes pour chaque partition de données, et celles dont les valeurs sont supérieures à 1 pour le "numéro de ligne partitionné" sont éliminées par le DELETE .