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é.