WITH t AS (
SELECT ts, (random()*100)::int AS bandwidth
FROM generate_series('2012-09-01', '2012-09-04', '1 minute'::interval) ts
)
SELECT date_trunc('hour', ts) AS hour_stump
,(extract(minute FROM ts)::int / 15) AS min15_slot
,count(*) AS rows_in_timeslice -- optional
,sum(bandwidth) AS sum_bandwidth
FROM t
WHERE ts >= '2012-09-02 00:00:00+02'::timestamptz -- user's time range
AND ts < '2012-09-03 00:00:00+02'::timestamptz -- careful with borders
GROUP BY 1, 2
ORDER BY 1, 2;
CTE t
cung cấp dữ liệu như bảng của bạn có thể chứa:một dấu thời gian ts
mỗi phút với bandwidth
con số. (Bạn không cần phần đó, thay vào đó bạn làm việc với bảng của mình.)
Dưới đây là một giải pháp rất tương tự cho một câu hỏi tương tự - với lời giải thích chi tiết về cách thức hoạt động của tập hợp cụ thể này:
- date_trunc khoảng thời gian 5 phút trong PostgreSQL
Đây là một giải pháp tương tự cho một câu hỏi tương tự liên quan đến đang chạy tổng - với giải thích chi tiết và các liên kết cho các chức năng khác nhau được sử dụng:
- PostgreSQL:số hàng đang chạy cho truy vấn 'theo phút'
Câu hỏi bổ sung trong nhận xét
WITH -- same as above ...
SELECT DISTINCT ON (1,2)
date_trunc('hour', ts) AS hour_stump
,(extract(minute FROM ts)::int / 15) AS min15_slot
,bandwidth AS bandwith_sample_at_min15
FROM t
WHERE ts >= '2012-09-02 00:00:00+02'::timestamptz
AND ts < '2012-09-03 00:00:00+02'::timestamptz
ORDER BY 1, 2, ts DESC;
Truy xuất một mẫu chưa được tổng hợp mỗi khoảng thời gian 15 phút - từ hàng cuối cùng có sẵn trong cửa sổ. Đây sẽ là phút thứ 15 nếu hàng không bị thiếu. Các bộ phận quan trọng được DISTINCT ON
và ORDER BY
.
Thông tin thêm về kỹ thuật được sử dụng tại đây:
- Chọn hàng đầu tiên trong mỗi GROUP BY nhóm?