Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2008 :supprimer les lignes en double

Vous pouvez DELETE d'un cte :

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1

Le ROW_NUMBER() La fonction attribue un numéro à chaque ligne. PARTITION BY est utilisé pour recommencer la numérotation de chaque élément de ce groupe, dans ce cas chaque valeur de uniqueid commencera la numérotation à 1 et remontera à partir de là. ORDER BY détermine l'ordre dans lequel les numéros vont. Puisque chaque uniqueid est numéroté à partir de 1, tout enregistrement avec un ROW_NUMBER() supérieur à 1 a un uniqueid en double

Pour comprendre comment le ROW_NUMBER() fonction fonctionne, essayez-la :

SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid

Vous pouvez ajuster la logique du ROW_NUMBER() fonction pour ajuster quel enregistrement vous allez conserver ou supprimer.

Par exemple, vous aimeriez peut-être le faire en plusieurs étapes, en supprimant d'abord les enregistrements avec le même nom de famille mais des prénoms différents, vous pouvez ajouter le nom de famille à la 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