使用SQL Server移动标准差

时间:2015-04-13 17:36:53

标签: sql sql-server sql-server-2008-r2

我有一个程序可以将每个非常大的表的移动平均值缓存到另一个表中,输出如下表所示:

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解决方案的移动平均值,但据我所知,这些解决方案不能适用于标准偏差。

2 个答案:

答案 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