Можете да DELETE
от cte:
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table)
DELETE FROM cte
WHERE RowRank > 1
ROW_NUMBER()
функцията присвоява номер на всеки ред. PARTITION BY
се използва за започване на номерирането отначало за всеки елемент в тази група, в този случай всяка стойност на uniqueid
ще започне номерирането от 1 и ще продължи оттам нагоре. ORDER BY
определя в кой ред влизат числата. Тъй като всеки uniqueid
се номерира, започвайки от 1, всеки запис с ROW_NUMBER()
по-голямо от 1 има дублиран uniqueid
За да разберете как ROW_NUMBER()
функцията работи, просто я изпробвайте:
SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid
Можете да коригирате логиката на ROW_NUMBER()
функция, за да коригирате кой запис ще запазите или премахнете.
Например, може би бихте искали да направите това на няколко стъпки, като първо изтриете записи със същото фамилно име, но различни собствени имена, можете да добавите фамилно име към 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