Trong Postgres , width_bucket()
chỉ là thứ bạn đang tìm kiếm - để chi tiết hóa bất kỳ số hàng nào (N
) trong bảng bên dưới thành một giá trị nhất định (tốt nhất là nhỏ hơn ) số điểm dữ liệu (n
). Bạn có thể thêm số lượng hàng đóng góp vào mỗi điểm dữ liệu để biểu thị trọng số.
Một trở ngại nhỏ:Biến thể của width_bucket()
chúng tôi cần hoạt động trên double precision
hoặc numeric
số, không có trên timestamp
et al. Chỉ cần trích xuất kỷ nguyên để làm việc với.
Giả sử định nghĩa bảng này và phiên bản Postgres hiện tại:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Truy vấn:
SELECT width_bucket(extract(epoch FROM t.created_at), x.min_epoch, x.max_epoch, 400) AS pix
, round(avg(t.value), 2) AS avg -- round is optional
, count(*) AS weight
FROM big t
CROSS JOIN (SELECT extract(epoch FROM min(created_at)) AS min_epoch
, extract(epoch FROM max(created_at)) AS max_epoch FROM big) x
GROUP BY 1
ORDER BY 1;
Kết quả:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Trả về 400 hàng - trừ khi N
<n
, trong trường hợp đó bạn nhận được N
hàng.
Có liên quan:
- Nhiều mức trung bình trong các khoảng cách đều nhau
- Tổng hợp (x, y) tọa độ các đám mây điểm trong PostgreSQL