Това трябва да го направи:
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;
Той създава извлечена таблица, която ще присвои уникални номера на всяка комбинация от (адрес, име на устройство, objectid), като дава най-ранния (този с най-малкото timestamp
стойност) числото 1. След това този резултат се използва за изтриване на всички онези, които нямат число 1. Виртуалната колона ctid
се използва за уникално идентифициране на тези редове (това е вътрешен идентификатор, предоставен от Postgres).
Имайте предвид, че за изтриване на наистина голямо количество редове подходът на Erwin със сигурност ще бъде по-бърз.
Демонстрация на SQLFiddle:http://www.sqlfiddle.com/#!1/5d9fe/ 2