No SQL Server a partir da versão 2005 e mais recente, você pode usar um CTE (Common Table Expression) com o
ROW_NUMBER
função para eliminar duplicatas:;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" seus dados por
UserID
, e para cada partição, o ROW_NUMBER
função distribui números sequenciais, começando em 1 e ordenados por Created DESC
- então a linha mais recente obtém RowNum = 1
(para cada UserID
) que é o que eu seleciono no CTE na instrução SELECT depois dele. Usando o mesmo CTE, você também pode excluir duplicatas facilmente:
;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
O mesmo princípio se aplica:você "agrupa" (ou particiona) seus dados por alguns critérios, numera consecutivamente todas as linhas para cada partição de dados e aquelas com valores maiores que 1 para o "número da linha particionada" são eliminadas pelo
DELETE
.