sql >> Database >  >> RDS >> Sqlserver

Dubbele vermeldingen met verschillende tijdstempels

Dit werkt, probeer het:

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

In een subquery bepaalt het welke record de eerste is voor elke Customer_Name ,Customer_ID en dan verwijdert het alle andere records voor een duplicaat. Ik heb ook de OUTPUT . toegevoegd clausule die rijen retourneert die door de instructie worden beïnvloed.

Je zou het ook kunnen doen met behulp van de rangschikkingsfunctie 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

Kijk welke een lagere querykost heeft en gebruik deze, toen ik het controleerde, was de eerste benadering efficiënter (het had een beter uitvoeringsplan).

Hier is een SQL Fiddle



  1. Waar verander je de waarde van lower_case_table_names=2 op windows xampp

  2. Ontbrekende indexen in MS SQL of optimalisatie in een mum van tijd

  3. SQL om dubbele vermeldingen te vinden (binnen een groep)

  4. Waarom duurt een Microsoft SQL Server 2012-query minuten via JDBC 4.0, maar seconden in Management Studio?