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

Số lần lăn của các hàng trong khoảng thời gian

Âm thanh như một ứng dụng cho chức năng cửa sổ . Nhưng, đáng buồn thay, đó không phải là trường hợp. Khung cửa sổ chỉ có thể dựa trên số lượng hàng, không dựa trên giá trị cột thực tế.

Một truy vấn đơn giản với LEFT JOIN có thể thực hiện công việc:

SELECT t0.order_id
     , count(t1.time_created) AS count_within_3_sec
FROM   tbl      t0
LEFT   JOIN tbl t1 ON t1.time_created BETWEEN t0.time_created - interval '3 sec'
                                          AND t0.time_created
GROUP  BY 1
ORDER  BY 1;

db <> fiddle tại đây

Không hoạt động với time như trong bản demo tối thiểu của bạn, vì điều đó không quấn quanh. Tôi cho rằng việc giả sử timestamp là hợp lý hoặc timestamptz .

Vì bạn bao gồm chính mỗi hàng trong số lượng, một INNER JOIN cũng sẽ hoạt động. (LEFT JOIN vẫn đáng tin cậy hơn khi đối mặt với các giá trị NULL có thể có.)

Hoặc sử dụng LATERAL truy vấn con và bạn không cần tổng hợp ở cấp truy vấn bên ngoài:

SELECT t0.order_id
     , t1.count_within_3_sec
FROM   tbl t0
LEFT   JOIN LATERAL (
   SELECT count(*) AS count_within_3_sec
   FROM   tbl t1
   WHERE  t1.time_created BETWEEN t0.time_created - interval '3 sec'
                              AND t0.time_created
   ) t1 ON true
ORDER  BY 1;

Có liên quan:

Đối với các bảng lớn và nhiều hàng trong khung thời gian, giải pháp thủ tục duyệt qua bảng một lần sẽ hoạt động tốt hơn. Như:




  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, tối thiểu, tối đa và số ngày trong phạm vi

  2. gói không thành công - Không thể tìm thấy thư viện máy khách PostgreSQL (libpq)

  3. postgresql cài đặt instace đơn

  4. Dung lượng đĩa cần thiết để lưu trữ giá trị NULL bằng cách sử dụng postgresql DB?

  5. Một cách mới để cá nhân hóa việc giám sát PostgreSQL của bạn với Prometheus