0

4列のテーブルがあります:

ID、GUID、バイナリ、タイムスタンプ。

私の目標は、バイナリの最後の 10 個の変更をデータベースに保存することです。11 番目の変更が挿入された場合は、最も古い変更を削除する必要があります。

私の現在のアプローチは、2つのステップでそれを行うことです(疑似mssql):

1) DELETE FROM mytable WHERE GUID = 'XXX' AND 
   ID NOT IN (SELECT TOP 9 ID FROM mytable WHERE GUID = 'XXX' ORDER BY Timestamp)

2) INSERT new binary ...

おそらく1つのステートメントで、より効率的に行う方法はありますか? mssql と postgresql の両方に互換性を持たせる方法はありますか (TOP / 制限なし)?

4

2 に答える 2

3

互換性のために cte を使用できます。

with cte as (
   select
       row_number() over(order by Timestamp desc) as row_num
   from mytable
   where GUID = 'XXX'
)
delete from cte
where row_num > 10

編集
ゴードン リノフの回答を参照してください。私の構文は PostgreSQL では機能しません。sqlfiddle でテストしただけです。私はSQL Serverを使いすぎています...

edit2
1 つのクエリでの削除と挿入について、PostgreSQL では次のことが可能です。

with cte_del as (
   select
       id,
       row_number() over(order by id desc) as row_num
   from tbl
   where GUID = 'XXX'
), cte_d as (
   delete from tbl where id in (select id from cte_del where row_num > 10)
)
insert into ...
select id from cte_del where row_num <= 10;

SQL フィドルのデモ

于 2013-08-19T13:51:23.460 に答える
2

以下は、SQL Server と Postgres の両方で機能すると思います。

with todelete as (
      select id, row_number() over (partition by GUID order by timestamp) as seqnum
      from mytable
      where GUID = 'xxx'
     )
delete from mytable
    where id in (select id from todelete where seqnum > 10);
于 2013-08-19T13:52:20.653 に答える