Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL:Loại bỏ các bản sao

Một ứng cử viên sách giáo khoa cho hàm cửa sổ 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

Điều này cũng xử lý tình huống có một tập hợp các lỗi lừa đảo trên (worker_ID,type_ID) chia sẻ cùng một date .
Xem bản demo đơn giản về dữ liệu.SE .

Cập nhật với phiên bản đơn giản hơn

Hóa ra, điều này có thể được đơn giản hóa:Trong SQL Server, bạn có thể xóa trực tiếp khỏi 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. Cách tính tuổi (theo năm) dựa trên Ngày sinh và getDate ()

  2. Xem sp_execute đang làm gì

  3. Mã hóa bảng cơ sở dữ liệu trong SQL Server 2008

  4. Tại sao một CTE đệ quy trong Transact-SQL lại yêu cầu UNION ALL chứ không phải UNION?

  5. Ưu và nhược điểm của việc giữ SQL trong Procs được lưu trữ so với Code là gì