PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL exclui todos os registros, exceto os mais antigos


Isso deve servir:
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;

Ele cria uma tabela derivada que atribuirá números exclusivos a cada combinação de (endereço, nome do dispositivo, id do objeto) fornecendo o mais antigo (aquele com o menor timestamp value) o número 1. Então este resultado é usado para excluir todos aqueles que não possuem o número 1. A coluna virtual ctid é usado para identificar exclusivamente essas linhas (é um identificador interno fornecido pelo Postgres).

Observe que, para excluir uma quantidade realmente grande de linhas, a abordagem de Erwin definitivamente será mais rápida.

Demonstração do SQLFiddle:http://www.sqlfiddle.com/#!1/5d9fe/ 2