34

可能重复:
在 Postgres 中将时间戳截断为 5 分钟的最快方法是什么?
具有任意精度的 Postgresql SQL GROUP BY 时间间隔(低至毫秒)

我想在 PostgreSQL 中每隔 5 分钟聚合一次数据。如果我使用该date_trunc()功能,我可以按每小时、每月、每天、每周等间隔聚合数据,但不能像 5 分钟或 5 天这样的特定间隔。

select date_trunc('hour', date1), count(*) from table1 group by 1;

我们如何在 PostgreSQL 中实现这一点?

4

2 回答 2

42
SELECT date_trunc('hour', date1) AS hour_stump
     , (extract(minute FROM date1)::int / 5) AS min5_slot
     , count(*)
FROM   table1
GROUP  BY 1, 2
ORDER  BY 1, 2;

您可以GROUP BY使用两列:截断为小时的时间戳和 5 分钟的时隙。

该示例生成插槽 0 - 111如果您愿意,请添加1 - 12
我将结果extract()转换为整数,因此除法会/ 5截断小数位。结果:第
0 - 4 分钟 -> 时隙 0
分钟 5 - 9 -> 时隙 1
等。

此查询仅返回找到值的那些 5 分钟时段的值。如果您想要每个插槽的值,或者如果您想要超过 5 分钟插槽的运行总和,请考虑以下相关答案:

于 2012-08-28T20:55:01.147 回答
1

这是一个简单的查询,您可以将其包装在一个函数中,也可以在整个位置进行剪切和粘贴:

select now()::timestamp(0), (extract(epoch from now()::timestamptz(0)-date_trunc('d',now()))::int)/60;

它会给你当前时间,以及一个从 0 到 n-1 的数字,这里 n=60。要每 5 分钟完成一次,请将该数字设为 300,依此类推。它按自一天开始以来的秒数分组。要使其从年开始、小时开始或其他任何时间开始按秒分组,请更改 date_trunc 中的“d”。

于 2012-08-28T19:55:43.920 回答