Detta borde göra 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;
Den skapar en härledd tabell som kommer att tilldela unika nummer till varje kombination av (adress, enhetsnamn, objekt-id) som ger den tidigaste (den med den minsta timestamp
värde) talet 1. Sedan används detta resultat för att ta bort alla de som inte har siffran 1. Den virtuella kolumnen ctid
används för att unikt identifiera dessa rader (det är en intern identifierare som tillhandahålls av Postgres).
Observera att för att radera en riktigt stor mängd rader kommer Erwins tillvägagångssätt definitivt att vara snabbare.
SQLFiddle-demo:http://www.sqlfiddle.com/#!1/5d9fe/ 2