SELECT grid.t5
,min(t."time") AS min_time
-- ,array_agg(extract(min FROM t."time")) AS 'players_on' -- optional
,avg(t.players) AS avg_players
,avg(t.servers) AS avg_servers
FROM (
SELECT generate_series(min("time")
,max("time"), interval '5 min') AS t5
FROM tbl
) grid
LEFT JOIN tbl t ON t."time" >= grid.t5
AND t."time" < grid.t5 + interval '5 min'
GROUP BY grid.t5
ORDER BY grid.t5;
Giải thích
-
Truy vấn con
grid
tạo một hàng cho mỗi 5 phút từ tối thiểu đến tối đa "time"
trong bảng của bạn. -
THAM GIA TRÁI trở lại bảng phân chia dữ liệu trong khoảng thời gian 5 phút. Cẩn thận bao gồm đường viền dưới và loại trừ đường viền trên.
-
Để thả các vị trí 5 phút mà không có gì xảy ra, hãy sử dụng
JOIN
thay choLEFT JOIN
. -
Để thời gian lưới của bạn bắt đầu lúc 0:00, 5:00, v.v., hãy làm tròn
min("time")
tronggenerate_series()
.
Giải thích thêm trong các câu trả lời liên quan sau:
Nhóm theo khoảng dữ liệu
PostgreSQL:số hàng đang chạy cho truy vấn 'theo phút'
Ngoài ra:Tôi sẽ không sử dụng time
làm định danh. Đó là từ dành riêng trong SQL chuẩn
và một hàm / tên loại trong Postgres.