我有一个程序可以将每个非常大的表的移动平均值缓存到另一个表中,输出如下表所示:
date AvgNet
---------- ----------------------
2014-05-12 116.553598762874
2014-05-13 116.672864387303
2014-05-14 116.141278835128
2014-05-15 118.067104561961
2014-05-16 117.92175621176
2014-05-19 117.056031596087
如何使用SQL计算上表中的移动标准差(即每个日期过去x行的标准差)?
我已经看到窗口函数和CTE解决方案的移动平均值,但据我所知,这些解决方案不能适用于标准偏差。
答案 0 :(得分:2)
SQL Server具有stdev()
功能。但是,它不会产生累积标准偏差,因此您需要使用相关子查询或cross apply
:
select t.*, t2.stdev10
from table t outer apply
(select stdev(t2.avgnet) as stdev10
from (select top 10 avgnet
from table t2
where t2.date <= t.date
order by t2.date desc
) t2
) t2;
答案 1 :(得分:1)
我看到你在SQL2008上了。如果你达到SQL2012或更高版本,以下工作就足够了。
SELECT * ,
STDEV(avgnet)
OVER (
ORDER BY date
ROWS BETWEEN 10 PRECEDING AND CURRENT ROW
) AS s
FROM dbo.TestData