Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL - Usunąć duplikaty, jeśli więcej niż 3 duplikaty?

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

Zapytanie generuje „numer wiersza” dla każdego rekordu, pogrupowany według (dupcol1, dupcol2) i uporządkowany według identyfikatora. W efekcie ten numer wiersza zlicza 'duplikaty', które mają te same dupcol1 i dupcol2 i przypisuje im numer 1, 2, 3. N, porządek według ID. Jeśli chcesz zachować tylko 2 'duplikaty', musisz usunąć te, którym przypisano numery 3,4,.. N i to jest część, którą zajmuje się DELLETE.. WHERE rn > 2;

Za pomocą tej metody możesz zmienić ORDER BY zgodnie z preferowaną kolejnością (np.ORDER BY ID DESC ), tak aby LATEST ma rn=1 , następny od ostatniego to rn=2 i tak dalej. Reszta pozostaje taka sama, DELETE usunie tylko najstarsze, ponieważ mają one najwyższe numery wierszy.

W przeciwieństwie do to ściśle powiązane pytanie , ponieważ warunek staje się bardziej złożony, używanie CTE i row_number() staje się prostsze. Wydajność może być nadal problematyczna, jeśli nie istnieje odpowiedni indeks dostępu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wydajność serwera SQL — testowanie w chmurze

  2. Połącz PowerShell i SQL Diagnostic Manager, aby zautomatyzować monitorowanie SQL Server

  3. Jaki jest najlepszy sposób na skrócenie daty w SQL Server?

  4. Jak zbudować instrukcję SQL z wykorzystaniem identyfikatorów, które mogą nie być dostępne w tabeli?

  5. W jakiej kolumnie należy umieścić indeks klastrowy?