PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL löscht alle bis auf die ältesten Datensätze

Das sollte es tun:

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;

Es erstellt eine abgeleitete Tabelle, die jeder Kombination von (Adresse, Gerätename, Objekt-ID) eindeutige Nummern zuweist, wobei die früheste (diejenige mit dem kleinsten timestamp) angegeben wird Wert) die Zahl 1. Dieses Ergebnis wird dann verwendet, um alle diejenigen zu löschen, die nicht die Zahl 1 haben. Die virtuelle Spalte ctid wird verwendet, um diese Zeilen eindeutig zu identifizieren (es ist eine interne Kennung, die von Postgres bereitgestellt wird).

Beachten Sie, dass Erwins Ansatz zum Löschen einer wirklich großen Anzahl von Zeilen definitiv schneller sein wird.

SQLFiddle-Demo:http://www.sqlfiddle.com/#!1/5d9fe/ 2