计算不规则数据的移动平均值
Posted
技术标签:
【中文标题】计算不规则数据的移动平均值【英文标题】:Calculating moving average over irregular data 【发布时间】:2020-08-17 22:08:53 【问题描述】:我正在尝试计算 SQL Server 数据库中多个字段的移动平均值,这些字段随着时间的推移涉及不规则间隔的值。我意识到对于定期间隔的数据,我可以使用SELECT grp, AVG(count) FROM t ... OVER (PARTITION BY grp ... ROWS 7 PRECEDING)
来创建前一周数据的移动平均值。但是,我的数据组织如下:
DATE GRP COUNT
2018-07-05 1 10
2018-07-08 1 4
2018-07-11 1 6
2018-07-12 1 6
2018-07-11 2 5
2018-07-15 2 10
2018-07-17 2 8
2018-07-20 2 10
...
对于大多数团体来说,某些日期没有观察到。我正在寻找的输出是:
DATE GRP MOVING_AVG
2018-07-05 1 10
2018-07-08 1 7
2018-07-11 1 6.67
2018-07-13 1 5.33
2018-07-11 2 5
2018-07-15 2 7.5
2018-07-16 2 7.67
2018-07-20 2 9.33
有没有办法在PRECEDING
子句中指定日期而不是行,还是我必须创建某种掩码来平均?
根据评论进行编辑以进行澄清
【问题讨论】:
你不能放一个WHERE YEAR(Date) >= '2018' AND YEAR(Date) < '2019'
吗?
我需要它是一个移动平均线,特别是它之前 365 天的所有事件,所以我不能像那样硬编码一年。
然后你把它变成像WHERE YEAR(Date) >= DATEADD(YEAR, -1, Date) AND YEAR(Date) < YEAR(Date)
这样的列名。举个例子,很难理解你到底想要什么。至少给出样本输入和预期输出。
我认为下面的建议可能是我需要的,但我会编辑我的问题以更好地说明我所追求的。
【参考方案1】:
在 SQL Server 中,我认为这可能通过横向连接更简单:
select
date,
grp,
(
select avg(count)
from mytable t1
where
t1.grp = t.grp
and t1.date >= dateadd(year, -1, t.date)
and t1.date <= t.date
) as cnt
from mytable
【讨论】:
【参考方案2】:如果我没有误会的话。您需要 7 天或其他任何天,但要在日期前行。
DATE GRP COUNT
2018-07-11 2 5
2018-07-15 2 10
2018-07-17 2 8
2018-07-20 2 10 <--- the AVG of this row must include 7 days before,so 2018-07-11 not include
在那种情况下:
select
date,
grp,
(
select avg(count)
from t t1
where
t1.grp = t.grp
and DATEDIFF(day, t1.date, t.date) <= 7 /*7 or whatever day you want*/
and t1.date <= t.date
) as MOVING_AVG
from t
【讨论】:
以上是关于计算不规则数据的移动平均值的主要内容,如果未能解决你的问题,请参考以下文章