Điều này nên làm điều đó:
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;
Nó tạo ra một bảng dẫn xuất sẽ gán các số duy nhất cho mỗi tổ hợp (địa chỉ, tên thiết bị, objectid) cho kết quả sớm nhất (bảng có timestamp
nhỏ nhất value) số 1. Sau đó, kết quả này được sử dụng để xóa tất cả những gì không có số 1. Cột ảo ctid
được sử dụng để xác định duy nhất các hàng đó (đó là số nhận dạng nội bộ do Postgres cung cấp).
Lưu ý rằng để xóa một lượng hàng thực sự lớn, cách tiếp cận của Erwin chắc chắn sẽ nhanh hơn.
Bản trình diễn SQLFiddle: http://www.sqlfiddle.com/#!1/5d9fe/ 2