Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zduplikowane wpisy z różnymi znacznikami czasu

To działa, spróbuj:

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

W podzapytaniu określa, który rekord jest pierwszym dla każdego Customer_Name ,Customer_ID a następnie usuwa wszystkie inne rekordy dla duplikatu. Dodałem również OUTPUT klauzula, która zwraca wiersze, których dotyczy instrukcja.

Możesz to również zrobić za pomocą funkcji rankingu 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

Zobacz, który z nich ma mniejszy koszt zapytania i użyj go, kiedy to sprawdziłem, pierwsze podejście było bardziej wydajne (miało lepszy plan wykonania).

Oto 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. Jak mogę uzyskać ostatnie 12 miesięcy od aktualnej daty PLUS dodatkowe dni do 1 dnia ostatniego miesiąca?

  2. Jak wygenerować instrukcje wstawiania z plików tekstowych dla tabeli SQL Server w SQL Server - SQL Server / TSQL Tutorial, część 106

  3. Gdzie wartość w kolumnie zawierającej wartości oddzielone przecinkami

  4. Darmowe metody naprawy korupcji indeksu SQL Server

  5. Zrozumienie funkcji GROUPING i GROUPING_ID w programie SQL Server