【问题标题】:Aggregate data to 30 minute intervals将数据聚合到 30 分钟间隔
【发布时间】:2019-01-28 21:17:03
【问题描述】:

A 有一个表格,其中每行相隔 300 秒(或 5 分钟)。我需要聚合每个小时和半小时的数据,聚合之前的所有内容,包括一小时或半小时。

我试过这段代码:

SELECT  
to_timestamp(floor(a / 1800 )) * 
1800) 
AT TIME ZONE 'UTC' as interval_alias, SUM(b) as b_sum
FROM TABLE_NAME GROUP BY interval_alias

...它聚合每小时和半小时的数据,但它汇总了每小时和半小时后的值。

表格如下所示:

a              | b    
-------------------------
1533045600     | 3
1533045900     | 5
1533046200     | 6
1533046500     | 3
1533046800     | 5
1533047100     | 2
1533047400     | 3 
1533047700     | 8
1533048000     | 5
1533048300     | 5
1533048600     | 6

上面代码的实际结果是:

a              | b
-------------------------
1533045600     | 24
1533047400     | 27

想要的输出是:

a              | b
-------------------------
1533045600     | 3
1533047400     | 24

【问题讨论】:

  • 无法重现您的错误。 postet SQL 看起来不正确
  • 你的数据列a的数据类型是什么?
  • 我的错误我已经编辑了问题,都是数字

标签: postgresql aggregate


【解决方案1】:

我对 interval_alias 使用了更简单的计算方法,并且使用 GROUP BY,您只能选择聚合或属于 GROUP BY 的列。 (您在问题中发布的SELECT * 看起来不正确...)

SELECT
  FLOOR(a/1800)*1800 AS interval_alias,
  SUM(b) AS sum_b
FROM TABLE_NAME
GROUP BY interval_alias

查看SQL Fiddle上的示例代码

更新: 这接近您想要的输出,但将包括第三个结果,因为您的测试数据跨越了半个多小时。

SELECT
  FLOOR(a/1800)*1800 + SIGN(a%1800)*1800 AS interval_alias,
  SUM(b) AS sum_b
FROM TABLE_NAME
GROUP BY interval_alias
ORDER BY interval_alias

【讨论】:

  • 谢谢。但这不是我想要的,因为它给了我相同的结果而不是想要的输出。
猜你喜欢
  • 1970-01-01
  • 2019-04-12
  • 2013-03-12
  • 2019-09-28
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
相关资源
最近更新 更多