Możesz DELETE
z akt:
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table)
DELETE FROM cte
WHERE RowRank > 1
ROW_NUMBER()
funkcja przypisuje numer do każdego wiersza. PARTITION BY
służy do rozpoczęcia numerowania od nowa dla każdego elementu w tej grupie, w tym przypadku każda wartość uniqueid
zacznie numerować od 1 i stamtąd pójdzie w górę. ORDER BY
określa, w jakiej kolejności wchodzą liczby. Ponieważ każdy uniqueid
jest numerowany od 1, dowolny rekord z ROW_NUMBER()
większe niż 1 ma zduplikowany uniqueid
Aby zrozumieć, jak ROW_NUMBER()
funkcja działa, po prostu wypróbuj:
SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid
Możesz dostosować logikę ROW_NUMBER()
funkcja, aby dostosować rekord, który chcesz zachować lub usunąć.
Na przykład, być może chcesz to zrobić w wielu krokach, najpierw usuwając rekordy z tym samym nazwiskiem, ale różnymi imionami, możesz dodać nazwisko do 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