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
.