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

Các mục nhập trùng lặp có dấu thời gian khác nhau

Điều này hoạt động, hãy thử nó:

DELETE  Customer_SCD
OUTPUT  deleted.*
FROM    Customer_SCD b
JOIN    (
    SELECT  MIN(a.Customer_TimeStamp) Customer_TimeStamp,
            Customer_ID,
            Customer_Name
    FROM    Customer_SCD a
    GROUP   BY a.Customer_ID, a.Customer_Name
) c ON 
    c.Customer_ID = b.Customer_ID
AND c.Customer_Name = b.Customer_Name
AND c.Customer_TimeStamp <> b.Customer_TimeStamp

Trong một truy vấn con, nó xác định bản ghi nào là bản ghi đầu tiên cho mỗi Customer_Name , Customer_ID và sau đó nó xóa tất cả các bản ghi khác để có bản sao. Tôi cũng đã thêm OUTPUT mệnh đề trả về các hàng bị ảnh hưởng bởi câu lệnh.

Bạn cũng có thể làm điều đó bằng cách sử dụng hàm xếp hạng ROW_NUMBER :

DELETE  Customer_SCD
OUTPUT  deleted.*
FROM    Customer_SCD b
JOIN    (
    SELECT  Customer_ID,
            Customer_Name,
            Customer_TimeStamp,
            ROW_NUMBER() OVER (PARTITION BY Customer_ID, Customer_Name ORDER BY Customer_TimeStamp) num
    FROM    Customer_SCD
) c ON 
    c.Customer_ID = b.Customer_ID
AND c.Customer_Name = b.Customer_Name
AND c.Customer_TimeStamp = b.Customer_TimeStamp
AND c.num <> 1

Xem cái nào có chi phí truy vấn nhỏ hơn và sử dụng nó, khi tôi kiểm tra nó, cách tiếp cận đầu tiên hiệu quả hơn (nó có kế hoạch thực thi tốt hơn).

Đây là SQL Fiddle



  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 chạy công việc tác nhân máy chủ SQL bằng T-SQL

  2. làm thế nào để tách chuỗi thành các cột khác nhau?

  3. Các Guids có được đảm bảo là duy nhất không?

  4. Cách xác định giá trị trường không thể chuyển đổi thành (thập phân, float, int) trong SQL Server

  5. SQL Server:Nhận khóa chính của bảng bằng truy vấn sql