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