sql >> Database >  >> RDS >> Sqlserver

SQL:duplicaten verwijderen

Een leerboekkandidaat voor de vensterfunctie row_number():

;WITH x AS (
    SELECT unique_ID
          ,row_number() OVER (PARTITION BY worker_ID,type_ID ORDER BY date) AS rn
    FROM   tbl
    )
DELETE FROM tbl
FROM   x
WHERE  tbl.unique_ID = x.unique_ID
AND    x.rn > 1

Dit zorgt ook voor de situatie waarin een reeks dupes op (worker_ID,type_ID) deelt dezelfde date .
Bekijk de vereenvoudigde demo op data.SE .

Update met eenvoudigere versie

Het blijkt dat dit vereenvoudigd kan worden:in SQL Server kun je direct uit de CTE verwijderen:

;WITH x AS (
    SELECT unique_ID
          ,row_number() OVER (PARTITION BY worker_ID,type_ID ORDER BY date) AS rn
    FROM   tbl
    )
DELETE x
WHERE  rn > 1


  1. PDO en caching, hoe implementeer je het in een databaseklasse?

  2. SQL om een ​​lijst met getallen van 1 tot 100 te genereren

  3. MySQL - Japans invoegen vanuit PHP - Coderingsproblemen

  4. Sjabloonpatronen en -modificaties voor datum-/tijdopmaak in PostgreSQL