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



    1. メッセージ:count():パラメーターは、centosでCountablecodeigniterを実装する配列またはオブジェクトである必要があります

    2. WEEKOFYEAR()の例– MySQL

    3. Magento:SQLSTATE [23000]:整合性制約違反:1062キー'UNQ_SALES_FLAT_ORDER_INの重複エントリ'100000001'

    4. PHP PDO関連:データベースのコンテンツを更新しないSQLステートメントを更新する