如何解决在间隙重新开始的 SQL 滚动平均值
我有每 1 小时出现一次的值,我需要计算 8 小时的滚动平均值。问题在于,当出现缺口时,该滚动平均线必须“重新启动”。
请参阅下表(我想要的输出),如您所见,缺少 14:45 的值,因此 15:45 的平均值是该行的 Scaled。
然后 16:45、17:45、18:45 和 19:45 值丢失,因此 20:45 的值是该行的 Scaled。
21:45 是 20:45 和 21:45 之间的平均值。
22:45 是 20:45、21:45 和 22:45 之间的平均值。
等等...
开始日期 | 缩放 | 滚动平均 |
---|---|---|
2021-01-28 00:45:00.000 | 10.589 | 10.589 |
2021-01-28 01:45:00.000 | 9.989 | 10.289000000000001 |
2021-01-28 02:45:00.000 | 10.512 | 10.363333333333335 |
2021-01-28 03:45:00.000 | 10.22 | 10.3275 |
2021-01-28 04:45:00.000 | 13.23 | 10.908000000000001 |
2021-01-28 05:45:00.000 | 14.516 | 11.509333333333336 |
2021-01-28 06:45:00.000 | 15.687 | 12.106142857142858 |
2021-01-28 07:45:00.000 | 14.316 | 12.382375000000001 |
2021-01-28 08:45:00.000 | 16.888 | 13.169750000000002 |
2021-01-28 09:45:00.000 | 24.58 | 14.993625000000002 |
2021-01-28 10:45:00.000 | 24.349 | 16.72325 |
2021-01-28 11:45:00.000 | 22.832 | 18.29975 |
2021-01-28 12:45:00.000 | 26.166 | 19.91675 |
2021-01-28 13:45:00.000 | 27.437 | 21.531875 |
2021-01-28 15:45:00.000 | 22.424 | 22.424 |
2021-01-28 20:45:00.000 | 19.629 | 19.629 |
2021-01-28 21:45:00.000 | 21.431 | 20.53 |
2021-01-28 22:45:00.000 | 22.07 | 21.04333333 |
我需要这个来进入视图,所以我不能使用变量。
我找不到办法做到这一点,因此将不胜感激任何帮助。
谢谢!
解决方法
您可能会发现蛮力方法是最简单的:
select t.*,v.avg_scaled
from (select t.*,lag(scaled,1) over (order by startdate) as scaled_1,2) over (order by startdate) as scaled_2,. . .
lag(startdate,1) over (order by startdate) as startdate_1,lag(startdate,2) over (order by startdate) as startdate_2,. . .
from t
) t cross apply
(select avg(v.scaled) as avg_scaled
from (values (0,t.scaled,t.startdate),(1,t.scaled_1,t.startdate_1),(2,t.scaled_2,t.startdate_2),. . .
) v(n,scaled,startdate)
where datediff(hour,v.start_date,t.startdate) = v.n
) v;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。