Tôi đề xuất hàm tiện dụng width_bucket()
:
Để lấy giá trị trung bình cho mỗi phân đoạn thời gian ("bin"):
SELECT width_bucket(extract(epoch FROM t.the_date)
, x.min_epoch, x.max_epoch, x.bins) AS bin
, avg(value) AS bin_avg
FROM tbl t
, (SELECT extract(epoch FROM min(the_date)) AS min_epoch
, extract(epoch FROM max(the_date)) AS max_epoch
, 10 AS bins
FROM tbl t
) x
GROUP BY 1;
Để nhận được "mức trung bình chạy" trong khoảng thời gian tăng trưởng (từng bước):
SELECT bin, round(sum(bin_sum) OVER w /sum(bin_ct) OVER w, 2) AS running_avg
FROM (
SELECT width_bucket(extract(epoch FROM t.the_date)
, x.min_epoch, x.max_epoch, x.bins) AS bin
, sum(value) AS bin_sum
, count(*) AS bin_ct
FROM tbl t
, (SELECT extract(epoch FROM min(the_date)) AS min_epoch
, extract(epoch FROM max(the_date)) AS max_epoch
, 10 AS bins
FROM tbl t
) x
GROUP BY 1
) sub
WINDOW w AS (ORDER BY bin)
ORDER BY 1;
Sử dụng the_date
thay vì date
làm tên cột, tránh các từ dành riêng
làm số nhận dạng.
Kể từ width_bucket()
hiện chỉ được triển khai cho double precision
và numeric
, Tôi trích xuất các giá trị kỷ nguyên từ the_date
. Thông tin chi tiết tại đây:
Tổng hợp (x, y) các đám mây điểm tọa độ trong PostgreSQL