sql >> Database teknologi >  >> RDS >> Sqlserver

group_concat i SQL Server 2008

I SQL Server fra og med version 2005 og nyere kan du bruge en CTE (Common Table Expression) med ROW_NUMBER funktion til at eliminere dubletter:

;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

Denne CTE "opdeler" dine data efter BrugerID , og for hver partition, ROW_NUMBER funktionen uddeler fortløbende numre, startende ved 1 og sorteret efter Created DESC - så den seneste række får RowNum =1 (for hver BrugerID ), hvilket er det, jeg vælger fra CTE i SELECT-sætningen efter den.

Ved at bruge den samme CTE kan du også nemt slette dubletter:

;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

Samme princip gælder:du "grupperer" (eller opdeler) dine data efter nogle kriterier, du nummererer fortløbende alle rækkerne for hver datapartition, og dem med værdier større end 1 for det "opdelte rækkenummer" luges ud af SLET .



  1. Rydder ud i et felt med telefonnumre i mySql

  2. MySQL konverter timediff output til dag, time, minut, sekund format

  3. Hvorfor ikke bruge varchar(max)?

  4. SQL Server 2005 Hvordan opretter man en unik begrænsning?