Ini harus melakukannya:
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;
Itu membuat tabel turunan yang akan menetapkan nomor unik untuk setiap kombinasi (alamat, nama perangkat, objectid) memberikan yang paling awal (yang dengan timestamp
terkecil value) angka 1. Kemudian hasil ini digunakan untuk menghapus semua yang tidak memiliki angka 1. Kolom virtual ctid
digunakan untuk mengidentifikasi baris tersebut secara unik (ini adalah pengidentifikasi internal yang disediakan oleh Postgres).
Perhatikan bahwa untuk menghapus sejumlah besar baris, pendekatan Erwin pasti akan lebih cepat.
Demo SQLFiddle:http://www.sqlfiddle.com/#!1/5d9fe/ 2