2016-10-27 8 views
1

私は2つのテーブルを持っています1. main_table 2. log_table main_tableでは、削除と更新時に影響を受けた行をlog_tableにコピーするトリガが定義されています。 log_tableでは、2つの余分な列pid(主キーint)とupdateat(タイムスタンプ)を除いて列は同じです。以下の方法でログテーブルからデータを削除する純粋なSQLメソッドはありますか?

毎月、cronジョブはlog_tableから10日以上経過したすべてのレコードを削除します。各行の最新の10を除くすべてのレコードを削除するために変更する必要があります。

私は別のIDを選択していますが、すべてのIDをループしていて、そのIDのすべてのデータをトップ10を除いて削除しています。 これは生産に苦労して非現実的です環境。私もこのロジックをカーソル付きのストアドプロシージャに移そうとしましたが、まだ遅いです。

私にはわかりませんが、私はそれを達成するための他の方法があると思います。どこにループを張る必要はありませんか?

サーバーはmssql 2012です(問題がある場合)。

答えて

2

これは必要なものですか?

with todelete as (
     select l.*, 
      row_number() over (partition by id order by updatedate desc) as seqnum 
     from log_table l 
    ) 
delete todelete 
    where seqnum > 10; 
+0

はい、これは私がやろうとしていたものです。 – Ratna

関連する問題