sql >> Database >  >> RDS >> Sqlserver

group_concat in SQL Server 2008

In SQL Server vanaf versie 2005 en nieuwer kunt u een CTE (Common Table Expression) gebruiken met het ROW_NUMBER functie om duplicaten te elimineren:

;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

Deze CTE "partitioneert" uw gegevens op UserID , en voor elke partitie, de ROW_NUMBER functie deelt volgnummers uit, beginnend bij 1 en besteld door Created DESC - dus de laatste rij krijgt RowNum = 1 (voor elke UserID ) wat ik selecteer uit de CTE in de SELECT-instructie erna.

Met dezelfde CTE kunt u ook eenvoudig duplicaten verwijderen:

;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

Hetzelfde principe is van toepassing:u "groepeert" (of verdeelt) uw gegevens volgens een aantal criteria, u nummert opeenvolgend alle rijen voor elke gegevenspartitie, en die met waarden groter dan 1 voor het "gepartitioneerde rijnummer" worden verwijderd door de DELETE .



  1. Hoe sla ik een BIGINT op in MySQL met PDO?

  2. php/Codeigniter-- Alleen datum vergelijken door tijd uit te sluiten

  3. Update-query om rijen in MySQL bij te werken

  4. Waarden die worden herhaald bij het vullen van een JTable