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