Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

group_concat no SQL Server 2008


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 .