PostgreSQL中的SQL每小时​​数据聚合


9

我是数据库的新手,因此正在寻求您的帮助。

我有一个包含时间序列数据的表。

2012/01/01 00:10, 10
2012/01/01 00:30, 5
2012/01/01 01:00, 10
2012/01/01 01:40, 10
2012/01/01 02:00, 20

该表通过仅保留间隔的上限来存储基于间隔的数据。例如,第一行代表从[00:00-00:10]到10的间隔,第二行代表从(00:10-00:30]到5的间隔,第三行代表(00:30-01:00)的时间间隔,值为10。

我需要在Postgres中进行高效的查询,以汇总每小时数据,以获取上述结构。因此结果将是这样的:

2012/01/01 00:00, 2012/01/01 01:00, 25
2012/01/01 01:00, 2012/01/01 02:00, 30

请注意,时间序列数据很大,因此对其建立索引的任何帮助将不胜感激。

谢谢,丹


1
例如2012/01/01 00:10, 10,在您的示例数据中,所有这些值是在单个列中还是逗号在列中定界?另外,是确切的时间(1:00,2:00,3:00等)保证被存储在时间序列表,或者可以它跳过:00和具有条目,如2012/01/01 03:50随后2012/01/01 04:10
dartonw 2014年

如果您有一个小时没有源数据怎么办?您还想要类似的输出2012/01/01 04:00, 2012/01/01 05:00, 0吗?还是应该从摘要中省略该小时?
Joshua Huber 2014年

@dartonw-逗号是列定界符。因此,日期时间和值是表中的不同列。确切的时间被保证总是被存储。
2014年

Answers:


8
select
  date_trunc('hour', t - interval '1 minute') as interv_start,
  date_trunc('hour', t - interval '1 minute')  + interval '1 hours' as interv_end,
 sum(v)
  from myt 
    group by date_trunc('hour', t - interval '1 minute')
order by interv_start

参见sqlfiddle

至于索引:您可以尝试使用函数索引,date_trunc('hour', t - interval '1 minute')但是我不确定postgresql是否可以使用它。


谢谢,老板很高兴。但是,如果您需要基于科学的精确方法,请继续学习以使用窗口函数。PostgreSQL本地支持它们:no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Brian Haak

赞!如果这是30分钟而不是1小时,您将如何处理
PirateApp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.