Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008:doppelte Zeilen löschen

Sie können DELETE von a cte:

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

Die ROW_NUMBER() Die Funktion weist jeder Zeile eine Nummer zu. PARTITION BY wird verwendet, um die Nummerierung für jedes Element in dieser Gruppe neu zu beginnen, in diesem Fall für jeden Wert von uniqueid beginnt die Nummerierung bei 1 und geht von dort aus nach oben. ORDER BY legt fest, in welcher Reihenfolge die Zahlen vorkommen. Da jede uniqueid wird bei 1 beginnend nummeriert, jeder Datensatz mit einer ROW_NUMBER() größer als 1 hat eine doppelte uniqueid

Um zu verstehen, wie die ROW_NUMBER() Funktion funktioniert, einfach ausprobieren:

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

Sie können die Logik der ROW_NUMBER() anpassen Funktion, um festzulegen, welche Aufzeichnungen Sie behalten oder entfernen.

Vielleicht möchten Sie dies beispielsweise in mehreren Schritten tun und zuerst Datensätze mit demselben Nachnamen, aber unterschiedlichen Vornamen löschen, Sie könnten den Nachnamen zu PARTITION BY hinzufügen :

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