Du kan DELETE
från 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()
funktionen tilldelar ett nummer till varje rad. PARTITION BY
används för att starta om numreringen för varje objekt i den gruppen, i det här fallet varje värde på uniqueid
kommer att börja numrera vid 1 och gå upp därifrån. ORDER BY
bestämmer vilken ordning numren går i. Eftersom varje uniqueid
numreras från 1, vilken post som helst med en ROW_NUMBER()
större än 1 har en dubblett av uniqueid
För att få en förståelse för hur ROW_NUMBER()
funktionen fungerar, prova bara:
SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid
Du kan justera logiken för ROW_NUMBER()
funktion för att justera vilken post du ska behålla eller ta bort.
Till exempel kanske du vill göra detta i flera steg, först radera poster med samma efternamn men olika förnamn, du kan lägga till efternamn till 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