PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL изтрива всички записи освен най-старите

Това трябва да го направи:

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;

Той създава извлечена таблица, която ще присвои уникални номера на всяка комбинация от (адрес, име на устройство, objectid), като дава най-ранния (този с най-малкото timestamp стойност) числото 1. След това този резултат се използва за изтриване на всички онези, които нямат число 1. Виртуалната колона ctid се използва за уникално идентифициране на тези редове (това е вътрешен идентификатор, предоставен от Postgres).

Имайте предвид, че за изтриване на наистина голямо количество редове подходът на Erwin със сигурност ще бъде по-бърз.

Демонстрация на SQLFiddle:http://www.sqlfiddle.com/#!1/5d9fe/ 2



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да проверите вашата PostgreSQL версия

  2. SQL - Как да избегнем скобите в PostgreSQL

  3. Агрегиране на свързани набори от възли / ръбове

  4. date_trunc 5 минути интервал в PostgreSQL

  5. Не може да се свърже с PostgreSQL Remotely на екземпляр на Amazon EC2 с помощта на PgAdmin