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_serversFROM ( SELECt generate_series(min("time") ,max("time"), interval '5 min') AS t5 FROM tbl ) gridLEFT JOIN tbl t ON t."time" >= grid.t5 AND t."time" < grid.t5 + interval '5 min'GROUP BY grid.t5ORDER BY grid.t5;解释
子查询
grid
每5分钟从表中的最小值“到最大值”产生一行记录time"
。以5分钟为间隔将LEFT JOIN返回表切片数据。仔细 包括 下边框,并 排除 上边框。
要在没有任何反应的情况下放5分钟的时隙,请使用
JOIN
代替LEFT JOIN
。要使网格时间从0:00、5:00等开始,请向下舍
min("time")入generate_series()
。
这些相关答案中的更多解释:
按数据间隔分组
PostgreSQL:“按分钟”运行查询的行数
另外:我不会使用它
time作为标识符。它是标准SQL中的保留字,而在Postgres中是函数/类型名。



