PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL xóa tất cả trừ các bản ghi cũ nhất

Điều này nên làm điều đó:

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;

Nó tạo ra một bảng dẫn xuất sẽ gán các số duy nhất cho mỗi tổ hợp (địa chỉ, tên thiết bị, objectid) cho kết quả sớm nhất (bảng có timestamp nhỏ nhất value) số 1. Sau đó, kết quả này được sử dụng để xóa tất cả những gì không có số 1. Cột ảo ctid được sử dụng để xác định duy nhất các hàng đó (đó là số nhận dạng nội bộ do Postgres cung cấp).

Lưu ý rằng để xóa một lượng hàng thực sự lớn, cách tiếp cận của Erwin chắc chắn sẽ nhanh hơn.

Bản trình diễn 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. Làm cách nào để nhóm trẻ em và phụ huynh trong một truy vấn?

  2. PostgreSQL và Dữ liệu tuần tự

  3. Làm thế nào để kết hợp tự nhiên hai truy vấn có mệnh đề với?

  4. LỖI của máy chủ địa lý:function postgis_lib_version ()

  5. Thay đổi một bảng bình thường thành một bảng cstore_fdw nước ngoài