sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL elimina todos menos los registros más antiguos

Esto debería hacerlo:

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 tabla derivada que asignará números únicos a cada combinación de (dirección, nombre de dispositivo, ID de objeto) dando el más antiguo (el que tiene la timestamp más pequeña valor) el número 1. Luego este resultado se utiliza para eliminar todos aquellos que no tienen el número 1. La columna virtual ctid se utiliza para identificar de forma única esas filas (es un identificador interno proporcionado por Postgres).

Tenga en cuenta que para eliminar una gran cantidad de filas, el enfoque de Erwin definitivamente será más rápido.

Demostración de SQLFiddle:http://www.sqlfiddle.com/#!1/5d9fe/ 2