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

SQL:Премахване на дубликати

Кандидат за учебник за прозоречната функция row_number():

;WITH x AS (
    SELECT unique_ID
          ,row_number() OVER (PARTITION BY worker_ID,type_ID ORDER BY date) AS rn
    FROM   tbl
    )
DELETE FROM tbl
FROM   x
WHERE  tbl.unique_ID = x.unique_ID
AND    x.rn > 1

Това също така се грижи за ситуацията, при която набор от дупки на (worker_ID,type_ID) споделя една и съща date .
Вижте опростената демо на data.SE .

Актуализирайте с по-проста версия

Оказва се, че това може да бъде опростено:В SQL Server можете да изтриете директно от CTE:

;WITH x AS (
    SELECT unique_ID
          ,row_number() OVER (PARTITION BY worker_ID,type_ID ORDER BY date) AS rn
    FROM   tbl
    )
DELETE x
WHERE  rn > 1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. План за изпълнение на разделен изглед

  2. Извикване на API от съхранената процедура на SQL Server

  3. Обединяване на множество бази данни в една база данни

  4. Как да създадете функция за начало и край на лятното часово време в SQL Server

  5. Инсталиране на SQL Server 2008