sql >> データベース >  >> RDS >> Sqlserver

SQLクエリ-3つ以上の重複がある場合、重複を削除しますか?

    with cte as (
      select row_number() over (partition by dupcol1, dupcol2 order by ID) as rn
         from table)
    delete from cte
       where rn > 2; -- or >3 etc
    

    クエリは、(dupcol1、dupcol2)でグループ化され、IDで並べ替えられた、各レコードの「行番号」を作成しています。実際、この行番号は、同じdupcol1とdupcol2を持つ「重複」をカウントし、ID順に番号1、2、3..Nを割り当てます。 2つの「複製」だけを保持したい場合は、番号3,4,.. Nが割り当てられたものを削除する必要があります。 これがDELLETE.. WHERE rn > 2;によって処理される部分です。

    このメソッドを使用すると、ORDER BYを変更できます ご希望の注文に合わせて(例:ORDER BY ID DESC )、LATEST rn=1があります 、次に最新のものはrn=2などです。残りは同じままです、DELETE 行番号が最も大きいので、最も古いものだけを削除します。

    この密接に関連する質問 、条件がより複雑になるにつれて、CTEとrow_number()の使用がより簡単になります。適切なアクセスインデックスが存在しない場合でも、パフォーマンスに問題が生じる可能性があります。



    1. これらの文字はXMLに有効ですか?

    2. 春のデータを使用した日付ASCによる注文

    3. データベースの同期MysqlSQLite

    4. VARCHAR2を数値に変換する