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

Дублиращи се записи с различно времево клеймо

Това работи, опитайте го:

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

В подзаявка той определя кой запис е първият за всеки Customer_Name ,Customer_ID и след това изтрива всички останали записи за дубликат. Добавих и OUTPUT клауза, която връща редове, засегнати от израза.

Можете също да го направите, като използвате функцията за класиране 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

Вижте кой има по-малка цена на заявката и го използвайте, когато го проверих, първият подход беше по-ефективен (имаше по-добър план за изпълнение).

Ето един 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. ms-access:как да направя правилна повторна заявка?

  2. COS() Примери в SQL Server

  3. Изберете колони от една таблица въз основа на имената на колони от друга таблица

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

  5. Преобразувайте „datetime2“ в „date“ в SQL Server (T-SQL примери)