Dit zou het moeten doen:
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;
Het creëert een afgeleide tabel die unieke nummers toekent aan elke combinatie van (adres, apparaatnaam, object-id) en de vroegste geeft (degene met de kleinste timestamp
waarde) het nummer 1. Dan wordt dit resultaat gebruikt om al diegenen te verwijderen die het nummer 1 niet hebben. De virtuele kolom ctid
wordt gebruikt om die rijen uniek te identificeren (het is een interne identificatie die door Postgres wordt geleverd).
Merk op dat voor het verwijderen van een heel groot aantal rijen, de aanpak van Erwin zeker sneller zal zijn.
SQLFiddle-demo:http://www.sqlfiddle.com/#!1/5d9fe/ 2