2

私は名前で顧客用のテーブルを持っています: Customer_SCDSQLでは、そこに3つの列が存在します: Customer_NameCustomer_ID Customer_TimeStamp

このテーブルには、タイムスタンプが異なる重複するエントリがあります。

例えば

ABC, 1, 2012-12-05 11:58:20.370

ABC, 1, 2012-12-03 12:11:09.840

これをデータベースから削除し、最初の日時を利用できるようにしたいと考えています。

ありがとう。

4

2 に答える 2

2

これは機能します。試してみてください。

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_NameCustomer_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フィドルです

于 2012-12-18T07:09:05.557 に答える
0

次のクエリは、保持したい結果を提供します。

Select Customer_Name, Customer_ID, MIN(Customer_TimeStamp) as Customer_TimeStamp
from Customer_SCD 
group by Customer_Name, Customer_ID 

結果をテーブル変数に格納します。@correctTbl

次に、このテーブルに参加して重複を削除します

delete 
from Customer_SCD a
inner join @correctTbl b on a.Customer_Name = b.Customer_Name and a.Customer_ID = b.Customer_ID and a.Customer_TimeStamp != b.Customer_TimeStamp
于 2012-12-18T07:09:24.580 に答える