sql >> Databasteknik >  >> RDS >> Sqlserver

group_concat i SQL Server 2008

I SQL Server från och med version 2005 och senare kan du använda en CTE (Common Table Expression) med ROW_NUMBER funktion för att eliminera dubbletter:

;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

Denna CTE "partitionerar" dina data med Användar-ID , och för varje partition, ROW_NUMBER funktionen delar ut sekventiella nummer, som börjar på 1 och sorteras efter Created DESC - så den senaste raden får RowNum =1 (för varje Användar-ID ) vilket är vad jag väljer från CTE i SELECT-satsen efter den.

Med samma CTE kan du också enkelt ta bort dubbletter:

;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

Samma princip gäller:du "grupperar" (eller partitionerar) dina data efter vissa kriterier, du numrerar i följd alla rader för varje datapartition, och de med värden större än 1 för det "partitionerade radnumret" såras bort av RADERA .



  1. 4 sätt att förhindra varningsöverbelastning med SQL Server-övervakning

  2. binary_log_types.h:Ingen sådan fil eller katalog

  3. Att anropa lagrad funktion eller procedur kommer inte att infogas och kvarstår ändringar

  4. PHP singleton databas anslutningsmönster