PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL menghapus semua kecuali catatan terlama

Ini harus melakukannya:

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;

Itu membuat tabel turunan yang akan menetapkan nomor unik untuk setiap kombinasi (alamat, nama perangkat, objectid) memberikan yang paling awal (yang dengan timestamp terkecil value) angka 1. Kemudian hasil ini digunakan untuk menghapus semua yang tidak memiliki angka 1. Kolom virtual ctid digunakan untuk mengidentifikasi baris tersebut secara unik (ini adalah pengidentifikasi internal yang disediakan oleh Postgres).

Perhatikan bahwa untuk menghapus sejumlah besar baris, pendekatan Erwin pasti akan lebih cepat.

Demo 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. koneksi menolak buruh pelabuhan postgres

  2. Menggunakan nilai parameter untuk skema dan tabel di Postgresql

  3. Panduan untuk Pgpool untuk PostgreSQL:Bagian Satu

  4. Validasi Django IntegerRangeField gagal

  5. Pertahankan zona waktu dalam jenis stempel waktu PostgreSQL