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()の使用がより簡単になります。適切なアクセスインデックスが存在しない場合でも、パフォーマンスに問題が生じる可能性があります。