Isso deve servir:
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;
Ele cria uma tabela derivada que atribuirá números exclusivos a cada combinação de (endereço, nome do dispositivo, id do objeto) fornecendo o mais antigo (aquele com o menor
timestamp
value) o número 1. Então este resultado é usado para excluir todos aqueles que não possuem o número 1. A coluna virtual ctid
é usado para identificar exclusivamente essas linhas (é um identificador interno fornecido pelo Postgres). Observe que, para excluir uma quantidade realmente grande de linhas, a abordagem de Erwin definitivamente será mais rápida.
Demonstração do SQLFiddle:http://www.sqlfiddle.com/#!1/5d9fe/ 2