sql >> Database >  >> RDS >> Sqlserver

SQL Query - Verwijder duplicaten als er meer dan 3 dups zijn?

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.



  1. Entity Framework Core 2.0:de abstracte basisklasse eenmalig configureren

  2. Niet tevredenLinkError in native methode

  3. SQL_CALC_FOUND_ROWS / FOUND_ROWS() werkt niet in PHP

  4. Het datamodel voor belangrijke data