Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008:elimina le righe duplicate

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