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