Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL заявка - Изтриване на дубликати, ако има повече от 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

Заявката произвежда „номер на ред“ за всеки запис, групиран по (dupcol1, dupcol2) и подреден по ID. Всъщност този номер на ред брои „дубликати“, които имат едни и същи dupcol1 и dupcol2 и присвоява след това числото 1, 2, 3.. N, подредени по ID. Ако искате да запазите само 2 „дубликати“, тогава трябва да изтриете тези, на които са присвоени номера 3,4,.. N и това е частта, за която се грижи DELLETE.. WHERE rn > 2;

С помощта на този метод можете да промените ORDER BY за да отговарят на предпочитаната от вас поръчка (напр.ORDER BY ID DESC ), така че LATEST има rn=1 , тогава следващият най-късен е rn=2 и така нататък. Останалото остава същото, DELETE ще премахне само най-старите, тъй като те имат най-високите номера на редовете.

За разлика от този тясно свързан въпрос , тъй като условието става по-сложно, използването на CTE и row_number() става по-просто. Производителността все още може да бъде проблематична, ако не съществува правилен индекс за достъп.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите съпоставянията на базата данни, поддържани от вашия екземпляр на SQL Server

  2. Как работят изчислените колони на SQL Server в EntityFramework?

  3. Как да контролирам надушването на параметри и/или подсказките за заявки в рамката на обекта?

  4. Промяна на таблици, които се репликират в SQL Server 2008 R2

  5. group_concat в SQL Server 2008