【问题标题】:How to calculate moving avg over time?如何计算随时间变化的移动平均线?
【发布时间】:2022-01-21 08:24:50
【问题描述】:

我随时都有传感器数据。我想按传感器对它们进行分组并计算 X 分钟或小时内的平均值。我尝试自己做,但没有奏效。你可以检查小提琴 [这里][1]。

简而言之,我必须向传感器显示 X 分钟或小时的移动平均数据。 [1]:http://sqlfiddle.com/#!17/e3101/14

谢谢

【问题讨论】:

  • 你想要的输出到底是什么?
  • @a_horse_with_no_name 数据不断来自传感器,如果给定持续时间,例如 10 分钟的 3 分钟,它会创建一个包含 X 分钟记录的窗口并将它们平均。例如,在 11:25、11:26、11:27、11:28、11:29 和 11:30 时的数据是 5 分钟,无论过去 5 分钟的平均值如何,它都应该显示出来。
  • edit您的问题并根据您的示例数据添加预期输出(作为格式化文本,请不要截屏)
  • Minimal, complete sample code 和数据应包含在question itself 中。请注意,除了在问题中添加代码之外,还欢迎添加指向实时示例的链接,但它不应该取代它。

标签: sql postgresql


【解决方案1】:

我不清楚你在追求什么输出,但也许你正在寻找窗口函数的range 条件:

select r.sensor_id,
       r.reading,
       r."timestamp",
       AVG(r.reading) OVER (partition by r.sensor_id 
                            ORDER BY r."timestamp" 
                            range between interval '5 minute' PRECEDING 
                                      AND CURRENT ROW) as avg_reading
from sensor_readings r 
order by r.sensor_id, r."timestamp"

Online example

【讨论】:

  • 不知道窗口函数这么强大。
  • 你能解释一下吗?我猜PRECEDING and CURRENT ROW 只检查当前行和最后一行并将其平均,但它如何在这里应用5 minute?请解释一下
  • 不是在间隔上运行,而不是在行数上运行。这就是rows betweenrange between 之间的区别。简介见here
  • @a_horse_with_no_name 那么它是根据最近 5 分钟出现的行进行平均的吗?
  • @a_horse_with_no_name 我认为你的这个答案正在做我正在寻找的,但它太复杂了,我无法理解stackoverflow.com/a/13820529/275002
【解决方案2】:

您需要 partition 子句,而不是 group by 子句。试试这是否可行。

Select sensor_id, 
       reading, 
       date_trunc('hour', "timestamp") AS sensor_reading_hour,
       AVG(reading) OVER(PARTITION BY sensor_id ORDER BY date_trunc('hour', "timestamp")) as avg_reading
from sensor_readings 

【讨论】:

  • 但是我需要平均 5 分钟/小时等时间,我该怎么做
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2020-03-28
相关资源
最近更新 更多