如何使用 sql 中的每 n 行(例如第 24、48 和 72 行)计算移动平均值?

Posted

技术标签:

【中文标题】如何使用 sql 中的每 n 行(例如第 24、48 和 72 行)计算移动平均值?【英文标题】:How to calculate moving average value using every nth row (e.g. 24th,48th and 72nd) in sql? 【发布时间】:2017-07-20 12:36:36 【问题描述】:

Here is the snip of my database 我想计算过去三天在精确小时内的平均能耗。因此,如果我在 2016 年 10 月 24 日消费。 10 小时,我想在同一小时添加过去三天的平均消耗量列,所以对于 23.10.2016。 10 小时,22.10.2016。 10 小时和 21.10.2016。 10小时。我的记录每小时测量一次,所以为了计算这个平均值,我必须查看每 24 行,但没有找到任何方法。如何修改我的查询以获得我想要的:

    select avg(consumption) over (order by entry_date rows between 72
    preceding and 24 preceding) from my_data;

或者有其他方法吗?

【问题讨论】:

请显示你的表结构 请不要使用不适用于您的问题的标签。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请添加only你实际使用的数据库的标签 我认为按小时过滤会更安全,也更容易,例如..Where DATEPART(HOUR, entry_date) = @hour 如果您的数据(或重复数据)有任何空白,则每第 n 条记录都会下降 Row_number() 对行进行编号,(Row_number() -1)%24 = 0 每 24 行过滤一次。 3 是一成不变的吗(总是 3 天?)此外,您是否保证表中始终有所需的行,或者它们可能会丢失 - 如果它们可能丢失,你怎么办要处理吗? 【参考方案1】:

也许试试这个:

select entry_date, EXTRACT(HOUR FROM entry_date),
     avg(consumption) over (PARTITION BY EXTRACT(HOUR FROM entry_date) 
         order by entry_date rows between 72 preceding and 24 preceding) 
from my_data;

您可以使用RANGE BETWEEN INTERVAL '72' HOUR PRECEDING AND INTERVAL '24' HOUR PRECEDING 而不是ROWS。这涵盖了存在间隔或重复时间值的情况。

【讨论】:

当然RANGE 规范更好;无论哪种方式,我认为这是最佳答案。 @Wernfried Domscheit 谢谢,这正是我所需要的。 :)【参考方案2】:

我认为您可以通过使用过滤器以另一种方式做到这一点。

Select avg(consumption) from my_data
 where 
     entry_date between @StartDate and @EndDate
 and datepart(HOUR, entry_date)=@hour

如果您使用的是 mysql

Select avg(consumption) from my_data
 where 
     entry_date between @StartDate and @EndDate
 and HOUR(entry_date)=@hour

【讨论】:

以上是关于如何使用 sql 中的每 n 行(例如第 24、48 和 72 行)计算移动平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在大数据帧的每组中有效地随机标记行?

如何将表中的每一行与所有行进行比较?

如何跳过sql查询中的前n行

(Golang)将数组中的所有行插入到表中

[Py]Spark SQL:使用框架的输入行约束窗口的每一帧

VBA - 删除每张工作簿上的每 N 行(每张工作表 100k+ 值)