sql >> Base de Datos >  >> RDS >> Sqlserver

group_concat en SQL Server 2008

En SQL Server a partir de la versión 2005 y posteriores, puede usar una CTE (Expresión de tabla común) con el ROW_NUMBER función para eliminar duplicados:

;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

Este CTE "particiona" sus datos por UserID , y para cada partición, el ROW_NUMBER función entrega números secuenciales, comenzando en 1 y ordenados por Created DESC - por lo que la última fila obtiene RowNum = 1 (para cada UserID ) que es lo que selecciono del CTE en la declaración SELECT que sigue.

Usando el mismo CTE, también puede eliminar fácilmente los duplicados:

;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

Se aplica el mismo principio:usted "agrupa" (o divide) sus datos según algún criterio, numera consecutivamente todas las filas para cada partición de datos, y aquellos con valores mayores que 1 para el "número de fila particionado" son eliminados por el DELETE .