Du kan DELETE
fra en 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()
funktion tildeler et nummer til hver række. PARTITION BY
bruges til at starte nummereringen forfra for hvert element i den gruppe, i dette tilfælde hver værdi af uniqueid
vil begynde at nummerere ved 1 og gå op derfra. ORDER BY
bestemmer hvilken rækkefølge tallene går i. Da hver uniqueid
bliver nummereret fra 1, enhver post med en ROW_NUMBER()
større end 1 har en dublet uniqueid
For at få en forståelse af, hvordan ROW_NUMBER()
funktionen virker, bare prøv den:
SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid
Du kan justere logikken i ROW_NUMBER()
funktion til at justere, hvilken registrering du vil beholde eller fjerne.
For eksempel vil du måske gerne gøre dette i flere trin, først at slette poster med det samme efternavn, men forskellige fornavne, du kan tilføje efternavn til 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