postgresql Postgres按时间戳分组为6个每小时一次的桶

gz5pxeao  于 5个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(77)

我有以下简单的表格:

ID      TIMESTAMP               VALUE
4   2011-05-27 15:50:04 1253
5   2011-05-27 15:55:02 1304
6   2011-05-27 16:00:02 1322
7   2011-05-27 16:05:01 1364

字符串
我想平均VALUES,和GROUPTIMESTAMP天分为6小时桶。例如00:00至06:00,06:00至12:00,12:00至18:00和18:00至00:00。
我可以使用以下查询按年、月、日和小时分组:

select avg(VALUE),
  EXTRACT(year from TIMESTAMP) AS year,
  EXTRACT(month from TIMESTAMP) AS month,
  EXTRACT(day from TIMESTAMP) as day
    from TABLE
      group by year,month,day


但我无法将每天分为4个阶段,如上文所定义,任何帮助都是最受欢迎的。

332nm8kg

332nm8kg1#

我认为分组(你的时间戳的小时/ 6)的商的整数值应该会有帮助。尝试一下,看看它是否有帮助。你的分组应该是这样的

group by year, month, day, trunc(EXTRACT(hour from TIMESTAMP) / 6)

字符串
这背后的逻辑是,当日期的小时部分除以6时,int值只能是

0 - 0:00 - 5:59:59
    1 - 6:00 - 11:59:59
    2 - 12:00 - 17:59:59
    3 - 18:00 - 23:59:59


使用这个插件应该每天将您的数据分成4组,这是您所需要的。

pinkon5k

pinkon5k2#

从Postgres 14开始,有date_bin函数可以提供帮助。
date_bin(stride, source, origin)

stride是interval类型的表达式。在您的示例中,为'6 hours'
source是您使用的时间戳。
origin是间隔开始计数的位置。对于您的情况,从午夜开始将获得您要查找的00:00、6:00、12:00、18:00桶。

应用到上面的查询,它看起来像:

select avg(VALUE),
  date_bin('6 hours', TIMESTAMP, '2011-01-01 00:00') as time_bucket
from TABLE
group by time_bucket

字符串
完整的date_bin文档:https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-BIN

相关问题