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
De query produceert een 'rijnummer' voor elk record, gegroepeerd op (dupcol1, dupcol2) en geordend op ID. In feite telt dit rijnummer 'duplicaten' die dezelfde dupcol1 en dupcol2 hebben en kent dan het nummer 1, 2, 3.. N toe, gerangschikt op ID. Als u slechts 2 'duplicaten' wilt behouden, moet u de nummers verwijderen die de nummers 3,4,.. N
hebben gekregen en dat is het deel dat wordt verzorgd door de DELLETE.. WHERE rn > 2;
Met deze methode kunt u de ORDER BY
. wijzigen om aan uw voorkeursvolgorde te voldoen (bijv.ORDER BY ID DESC
), zodat de LATEST
heeft rn=1
, dan is de voorlaatste rn=2 enzovoort. De rest blijft hetzelfde, de DELETE
verwijdert alleen de oudste omdat deze de hoogste rijnummers hebben.
In tegenstelling tot deze nauw verwante vraag , naarmate de voorwaarde complexer wordt, wordt het gebruik van CTE's en row_number() eenvoudiger. De prestaties kunnen nog steeds problematisch zijn als er geen goede toegangsindex bestaat.