根据PostgreSQL中的时间戳移动窗口/平均值

时间:2016-03-15 19:26:06

标签: sql postgresql window-functions moving-average

我的问题与问here的问题相同,但所选答案为“假设您希望在每15分钟间隔后重新启动滚动平均值”。如果我不这样做怎么办?即如果我想为每一行和接下来的十五分钟行提供不同的滚动平均值,该怎么办?

1 个答案:

答案 0 :(得分:1)

我会将其视为相关子查询:

select t.*,
       (select avg(t2.col)
        from t t2
        where t2.timestamp >= t.timestamp and
              t2.timestamp < t.timestamp + interval '15 minute'
       ) as future_15min_avg
from t;

这对窗口函数来说很有挑战性,因为窗口的大小可能会因每行而改变。

对于大量数据,有一种替代方法更麻烦但更有效。使用临时表可能最好。这个想法是:

  • 在表
  • 中插入每个时间戳及其值
  • 在表格中插入每个时间戳加15分钟,值为0
  • 在时间戳上添加索引
  • 对值进行累计求和
  • 在原始表和此表之间使用两个连接以获得总和

您可以使用CTE尝试此操作,性能可能正常。但是,我认为指数可能对绩效很重要。并且,假设您在时间列上有索引,相关子查询即使对于数百或数千行也可能很好。