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

Requête SQL - Supprimer les doublons si plus de 3 doublons ?

with cte as (
  select row_number() over (partition by dupcol1, dupcol2 order by ID) as rn
     from table)
delete from cte
   where rn > 2; -- or >3 etc

La requête fabrique un "numéro de ligne" pour chaque enregistrement, regroupé par (dupcol1, dupcol2) et classé par ID. En effet ce numéro de ligne compte les 'doublons' qui ont le même dupcol1 et dupcol2 et leur attribue alors le numéro 1, 2, 3.. N, trié par ID. Si vous ne souhaitez conserver que 2 'doublons', vous devez supprimer ceux auxquels ont été attribués les numéros 3,4,.. N et c'est la partie prise en charge par le DELLETE.. WHERE rn > 2;

En utilisant cette méthode, vous pouvez modifier le ORDER BY en fonction de votre commande préférée (par exemple.ORDER BY ID DESC ), de sorte que le LATEST a rn=1 , alors l'avant-dernier est rn=2 et ainsi de suite. Le reste reste le même, le DELETE ne supprimera que les plus anciens car ils ont les numéros de ligne les plus élevés.

Contrairement à cette question étroitement liée , à mesure que la condition devient plus complexe, l'utilisation des CTE et de row_number() devient plus simple. Les performances peuvent encore être problématiques s'il n'existe pas d'index d'accès approprié.