sql >> Databáze >  >> RDS >> Sqlserver

SQL Query – Odstranit duplikáty, pokud jsou duplicitní více než 3?

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

Dotaz vytváří 'číslo řádku' pro každý záznam, seskupené podle (dupcol1, dupcol2) a seřazené podle ID. Ve skutečnosti toto číslo řádku počítá 'duplikáty', které mají stejný dupcol1 a dupcol2 a přiřadí jim číslo 1, 2, 3.. N, pořadí podle ID. Pokud si chcete ponechat pouze 2 'duplikáty', musíte smazat ty, kterým byla přiřazena čísla 3,4,.. N a to je část, o kterou se stará DELLETE.. WHERE rn > 2;

Pomocí této metody můžete změnit ORDER BY podle vaší preferované objednávky (např.ORDER BY ID DESC ), takže LATESTrn=1 , pak další k nejnovější je rn=2 a tak dále. Zbytek zůstává stejný, DELETE odstraní pouze ty nejstarší, protože mají nejvyšší čísla řádků.

Na rozdíl od tato úzce související otázka , jak se podmínka stává složitější, je používání CTE a row_number() jednodušší. Výkon může být stále problematický, pokud neexistuje správný přístupový index.



  1. Vraťte seznam všech spouštěčů serveru v SQL Server

  2. Jak zkompilovat další zdrojové soubory v cmake po procesu sestavení

  3. Jak vrátit řádky výsledku dotazu ve funkci PostgreSQL?

  4. Programování databáze Python s SQL Express pro začátečníky