使用 SQL 服务器移动标准差
Moving standard deviation with SQL Server
我有一个程序每天将一个非常大的 table 的移动平均线缓存到另一个 table 中,输出如下 table 所示:
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 计算上述 table 的移动标准偏差(即每个日期过去 x 行数的标准偏差)?
我看过 window 移动平均线的函数和 CTE 解决方案,但据我了解,这些解决方案不能适用于标准偏差。
SQL服务器有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;
我看到您使用的是 SQL 2008。如果您使用的是 SQL 2012 或更高版本,那么以下方法就足够了。
SELECT * ,
STDEV(avgnet)
OVER (
ORDER BY date
ROWS BETWEEN 10 PRECEDING AND CURRENT ROW
) AS s
FROM dbo.TestData
我有一个程序每天将一个非常大的 table 的移动平均线缓存到另一个 table 中,输出如下 table 所示:
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 计算上述 table 的移动标准偏差(即每个日期过去 x 行数的标准偏差)?
我看过 window 移动平均线的函数和 CTE 解决方案,但据我了解,这些解决方案不能适用于标准偏差。
SQL服务器有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;
我看到您使用的是 SQL 2008。如果您使用的是 SQL 2012 或更高版本,那么以下方法就足够了。
SELECT * ,
STDEV(avgnet)
OVER (
ORDER BY date
ROWS BETWEEN 10 PRECEDING AND CURRENT ROW
) AS s
FROM dbo.TestData