これでうまくいくはずです:
delete from devices
using (
select ctid as cid,
row_number() over (partition by devicename, objectid order by timestamp asc) as rn
from devices
) newest
where newest.cid = devices.ctid
and newest.rn <> 1;
(アドレス、デバイス名、オブジェクトID)の各組み合わせに一意の番号を割り当て、最も早いもの(timestamp
が最小のもの)を与える派生テーブルを作成します。 値)数値1。次に、この結果を使用して、数値1を持たないものをすべて削除します。仮想列ctid
これらの行を一意に識別するために使用されます(これはPostgresによって提供される内部識別子です)。
非常に大量の行を削除する場合、Erwinのアプローチの方が間違いなく高速であることに注意してください。
SQLFiddleデモ: http://www.sqlfiddle.com/#!1/5d9fe/ 2