Â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ư:
- Chức năng Cửa sổ hoặc Biểu thức Bảng Thông thường:đếm các hàng trước đó trong phạm vi
- Giải pháp thay thế cho PL / ruby bị hỏng:chuyển đổi bảng nhật ký kho
- GROUP BY và tổng hợp giá trị số tuần tự