Puoi DELETE da un cte:
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table)
DELETE FROM cte
WHERE RowRank > 1
Il ROW_NUMBER() La funzione assegna un numero a ciascuna riga. PARTITION BY viene utilizzato per ricominciare la numerazione per ogni elemento in quel gruppo, in questo caso ogni valore di uniqueid inizierà la numerazione da 1 e salirà da lì. ORDER BY determina in quale ordine vanno i numeri. Poiché ogni uniqueid viene numerato a partire da 1, qualsiasi record con un ROW_NUMBER() maggiore di 1 ha un uniqueid duplicato
Per capire come funziona ROW_NUMBER() la funzione funziona, provalo:
SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid
Puoi modificare la logica di ROW_NUMBER() funzione per regolare quale record manterrai o rimuoverai.
Ad esempio, forse vorresti farlo in più passaggi, eliminando prima i record con lo stesso cognome ma nomi diversi, potresti aggiungere il cognome a 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