如何使用 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 行)计算移动平均值?的主要内容,如果未能解决你的问题,请参考以下文章