sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008:dubbele rijen verwijderen

U kunt DELETE van een cte:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1

De ROW_NUMBER() functie wijst een nummer toe aan elke rij. PARTITION BY wordt gebruikt om de nummering opnieuw te beginnen voor elk item in die groep, in dit geval elke waarde van uniqueid begint met nummeren bij 1 en gaat vanaf daar omhoog. ORDER BY bepaalt in welke volgorde de nummers komen. Aangezien elke uniqueid wordt genummerd vanaf 1, elk record met een ROW_NUMBER() groter dan 1 heeft een dubbele uniqueid

Om inzicht te krijgen in hoe de ROW_NUMBER() functie werkt, probeer het gewoon:

SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid

U kunt de logica van de ROW_NUMBER() . aanpassen functie om aan te passen welke record u bewaart of verwijdert.

Als u dit bijvoorbeeld in meerdere stappen wilt doen, eerst records met dezelfde achternaam maar verschillende voornamen verwijderen, kunt u de achternaam toevoegen aan de PARTITION BY :

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid, col3 ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1


  1. Hoe te selecteren uit mysql-arraytekst en te vergelijken?

  2. WHERE IN voorwaarde accepteert geen tekenreekswaarde

  3. SQL Less Than () Operator voor beginners

  4. SQL haalt gegevens uit BEGIN; ...; EINDE; blok in python