2017-10-30 10 views
0

私はすべてのリソースの時間でエントリを更新するテーブルを持っています。簡単にするために、テーブルが非常に短い時間間隔でエントリを削除する

は、数ミリ秒以内の多くのRESOURCEID(S)のためのいくつかの理由のテーブルの上にあった複数のエントリの場合
-entrytime

を-resourceidこれらの必須の列を持って言うことができますし、私が削除したいですそのように記録された第2のエントリ。

エントリを見つけるためにテーブルに自己結合を行うことによって、そのようなエントリを見つけることを問い合わせました。

select b.resourceid,b.entrytime 
from RESOURCE_DATA_TABLE a 
    join RESOURCE_DATA_TABLE b on a.resourceid=b.resourceid 
where b.collectiontime > a.entrytime 
    and b.entrytime < (a.entrytime + interval '4 millisecond'); 

ただし、1回のショットでどのように削除すればよいですか。

+0

RESOURCE_DATA_TABLEテーブルにIDの自動インクリメントのような主キー列がありますか? –

+0

resourceidは外部キーであり、resourceidとentrytimeは複合キーとして一緒に機能します。 – Tharun

答えて

1

をお試しください:

select * 
from (
    select resourceid, entrytime, 
     entrytime - lag(entrytime) over (partition by resourceid order by entrytime) as diff, 
     row_number() over (partition by resourceid order by entrytime) as rn 
    from resource_data_table 
) t 
where diff < interval '4 millisecond'; 

今、あなたがそれを行うに使用することができます行を削除してください:

delete from resource_data_table 
where (resourceid, entrytime) in (select resourceid, entrytime 
            from (
            select resourceid, entrytime, 
              entrytime - lag(entrytime) over (partition by resourceid order by entrytime) as diff, 
              row_number() over (partition by resourceid order by entrytime) as rn 
            from resource_data_table 
           ) t 
            where diff < interval '4 millisecond' 
            and rn > 1) 
+0

ありがとう!完璧に働いた! – Tharun

0

これあなたが行を見つけるために、ウィンドウ関数を使用する場合は、少し簡単になります。この

Delete 
FROM RESOURCE_DATA_TABLE r 
WHERE 
    EXISTS (

     select * 
     from RESOURCE_DATA_TABLE a 
     join RESOURCE_DATA_TABLE b on a.resourceid=b.resourceid 
     where b.collectiontime > a.entrytime 
     and b.entrytime < (a.entrytime + interval '4 millisecond') 
     and b.resourceid = r.resourceid 
     and b.entrytime = r.entrytime 

) 

ORこの

Delete 
FROM RESOURCE_DATA_TABLE r 
WHERE 
    EXISTS (
     Select * from 
     (select b.resourceid,b.entrytime 
     from RESOURCE_DATA_TABLE a 
     join RESOURCE_DATA_TABLE b on a.resourceid=b.resourceid 
     where b.collectiontime > a.entrytime 
     and b.entrytime < (a.entrytime + interval '4 millisecond') 
    ) temp 
     where temp.resourceid = r.resourceid 
     and temp.entrytime = r.entrytime 

) 
関連する問題