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

Thứ tự sắp xếp xác định cho các hàm cửa sổ

Nếu bạn không có slno trong bảng của bạn, thì bạn không có bất kỳ thông tin đáng tin cậy nào mà hàng đã được chèn trước. Không có thứ tự tự nhiên trong bảng, thứ tự vật lý của các hàng có thể thay đổi bất kỳ lúc nào (với bất kỳ bản cập nhật nào hoặc với VACUUM , v.v.)

Bạn có thể sử dụng không đáng tin cậy mẹo:đặt hàng theo ctid nội bộ .

select *
from  (
   select id, status
        , row_number() OVER (PARTITION BY id
                             ORDER BY date, ctid) AS row_num
   from   status  -- that's your table name??
   where  date >= '2015-06-01'  -- assuming column is actually a date
   and    date <  '2015-07-01'
  ) sub
where  row_num = 1;
  • Không có bất kỳ thông tin nào khác, hàng nào đứng trước (đó là lỗi thiết kế để bắt đầu, hãy khắc phục sự cố!), bạn có thể cố gắng lưu những gì bạn có thể sử dụng nội bộ tuple ID ctid

    Các hàng sẽ theo thứ tự vật lý khi được chèn vào ban đầu, nhưng điều đó có thể thay đổi bất kỳ lúc nào với bất kỳ thao tác ghi vào bảng hoặc VACUUM hoặc các sự kiện khác.
    Đây là biện pháp cuối cùng và nó sẽ phá vỡ.

  • Truy vấn đã trình bày của bạn không hợp lệ về một số số lượng:thiếu tên cột trong CTE đầu tiên, thiếu tên bảng trong CTE thứ hai, ...

  • Bạn không cần CTE cho việc này.

Đơn giản hơn với DISTINCT ON (cân nhắc đối với ctid áp dụng tương tự):

SELECT DISTINCT ON (id)
       id, status
FROM   status
WHERE  date >= '2015-06-01'
AND    date <  '2015-07-01'
ORDER  BY id, date, ctid;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay thế động cho trục xoay với CASE và GROUP BY

  2. Làm thế nào để chuyển đổi một db trong postgreSQL thành utf8?

  3. Giá trị lỗi không tồn tại - postgresql CHÈN VÀO sự cố

  4. Cách nối chuỗi trong PostgreSQL

  5. Cách Cos () hoạt động trong PostgreSQL