Dette burde gøre det:
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;
Det opretter en afledt tabel, der vil tildele unikke numre til hver kombination af (adresse, enhedsnavn, objekt-id), der giver den tidligste (den med det mindste timestamp
værdi) tallet 1. Så bruges dette resultat til at slette alle dem, der ikke har tallet 1. Den virtuelle kolonne ctid
bruges til entydigt at identificere disse rækker (det er en intern identifikator leveret af Postgres).
Bemærk, at for at slette en rigtig stor mængde rækker, vil Erwins tilgang helt sikkert være hurtigere.
SQLFiddle-demo:http://www.sqlfiddle.com/#!1/5d9fe/ 2