PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL elimina tutti i record tranne i più vecchi

Questo dovrebbe farlo:

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;

Crea una tabella derivata che assegnerà numeri univoci a ciascuna combinazione di (indirizzo, nome dispositivo, id oggetto) fornendo la prima (quella con il timestamp più piccolo value) il numero 1. Quindi questo risultato viene utilizzato per eliminare tutti quelli che non hanno il numero 1. La colonna virtuale ctid viene utilizzato per identificare in modo univoco quelle righe (è un identificatore interno fornito da Postgres).

Nota che per eliminare una quantità davvero grande di righe, l'approccio di Erwin sarà sicuramente più veloce.

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