Cela devrait le faire :
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;
Il crée une table dérivée qui attribuera des numéros uniques à chaque combinaison de (adresse, nom de périphérique, objectid) en donnant le plus ancien (celui avec le plus petit timestamp
valeur) le chiffre 1. Puis ce résultat est utilisé pour supprimer tous ceux qui n'ont pas le chiffre 1. La colonne virtuelle ctid
est utilisé pour identifier de manière unique ces lignes (il s'agit d'un identifiant interne fourni par Postgres).
Notez que pour supprimer un très grand nombre de lignes, l'approche d'Erwin sera certainement plus rapide.
Démo SQLFiddle :http://www.sqlfiddle.com/#!1/5d9fe/ 2