移动平均值基于PostgreSQL中的时间戳

A.A*_*idi 19 sql postgresql timestamp moving-average

我想通过时间戳执行移动平均线.我有两列:温度和时间戳(时间 - 日期),我想基于每15分钟的连续温度观察来执行移动平均.换句话说,选择数据以基于15分钟时间间隔执行平均.而且,对于不同的时间序列,可以具有不同数量的观察.我的意思是所有窗口大小相等(15分钟),但每个窗口中可能有不同数量的观察.例如:对于第一个窗口,我们必须计算n个观测值的平均值,而对于第二个窗口,计算n + 5观测值的平均值.

数据样本:

ID   Timestamps          Temperature
1    2007-09-14 22:56:12 5.39
2    2007-09-14 22:58:12 5.34
3    2007-09-14 23:00:12 5.16
4    2007-09-14 23:02:12 5.54
5    2007-09-14 23:04:12 5.30
6    2007-09-14 23:06:12 5.20
7    2007-09-14 23:10:12 5.39
8    2007-09-14 23:12:12 5.34
9    2007-09-14 23:20:12 5.16
10   2007-09-14 23:24:12 5.54
11   2007-09-14 23:30:12 5.30
12   2007-09-14 23:33:12 5.20
13   2007-09-14 23:40:12 5.39
14   2007-09-14 23:42:12 5.34
15   2007-09-14 23:44:12 5.16
16   2007-09-14 23:50:12 5.54
17   2007-09-14 23:52:12 5.30
18   2007-09-14 23:57:12 5.20

主要挑战:

如何因为不同的采样频率而没有确切的15分钟时间间隔,我可以学习每15分钟识别一次的代码.

dan*_*era 10

你可以自己加入你的桌子:

select l1.id, avg( l2.Temperature )
from l l1
inner join l l2 
   on l2.id <= l1.id and
      l2.Timestamps + interval '15 minutes' > l1.Timestamps
group by l1.id
order by id
;
Run Code Online (Sandbox Code Playgroud)

结果:

| ID |            AVG |
-----------------------
|  1 |           5.39 |
|  2 |          5.365 |
|  3 | 5.296666666667 |
|  4 |         5.3575 |
|  5 |          5.346 |
|  6 | 5.321666666667 |
|  7 | 5.331428571429 |
Run Code Online (Sandbox Code Playgroud)

注意:只做"努力工作".您应该将结果与原始表连接或附加新列以进行查询.我不知道你需要的最终查询.调整此解决方案或寻求更多帮助.


a_h*_*ame 7

假设您希望在每15分钟间隔后重新启动滚动平均值:

select id, 
       temp,
       avg(temp) over (partition by group_nr order by time_read) as rolling_avg
from (       
  select id, 
         temp,
         time_read, 
         interval_group,
         id - row_number() over (partition by interval_group order by time_read) as group_nr
  from (
    select id, 
           time_read, 
           'epoch'::timestamp + '900 seconds'::interval * (extract(epoch from time_read)::int4 / 900) as interval_group,
           temp
    from readings
  ) t1
) t2
order by time_read;
Run Code Online (Sandbox Code Playgroud)

它基于Depesz的 "时间范围"分组解决方案:

这是一个SQLFiddle示例:http://sqlfiddle.com/#!1,0f3f0/2