Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Entri duplikat dengan stempel waktu berbeda

Ini berhasil, coba:

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

Dalam subquery menentukan record mana yang pertama untuk setiap Customer_Name ,Customer_ID dan kemudian menghapus semua catatan lain untuk duplikat. Saya juga menambahkan OUTPUT klausa yang mengembalikan baris yang dipengaruhi oleh pernyataan.

Anda juga dapat melakukannya dengan menggunakan fungsi peringkat 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

Lihat mana yang memiliki biaya kueri lebih kecil dan gunakan, ketika saya memeriksanya, pendekatan pertama lebih efisien (memiliki rencana eksekusi yang lebih baik).

Berikut adalah 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. Memanggil prosedur tersimpan menggunakan VBA

  2. Apakah mungkin mengakses database .mdf tanpa SQL Server?

  3. Statistik Tambahan SQL Server 2014

  4. Bagaimana cara membangun fungsionalitas RUNAS /NETONLY ke dalam program (C#/.NET/WinForms)?

  5. SQL Server:Apakah mungkin untuk memasukkan ke dalam dua tabel secara bersamaan?