Mělo by to stačit:
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;
Vytvoří odvozenou tabulku, která každé kombinaci (adresa, název zařízení, id objektu) přiřadí jedinečná čísla, přičemž se získá ta nejstarší (ta s nejmenším timestamp
hodnota) číslo 1. Potom se tento výsledek použije k odstranění všech, které nemají číslo 1. Virtuální sloupec ctid
se používá k jednoznačné identifikaci těchto řádků (je to interní identifikátor dodávaný společností Postgres).
Všimněte si, že pro mazání opravdu velkého množství řádků bude Erwinův přístup zcela jistě rychlejší.
Ukázka SQLFiddle:http://www.sqlfiddle.com/#!1/5d9fe/ 2