我的数据库中有一列数字。如何计算标准差?我不想使用 stddev 功能。
问问题
5169 次
2 回答
1
只是因为好奇,我决定测试实际的 STDEV()。现在,我无法确定内置功能。
我很接近... 0.000141009220002264 或 0.00748% 折扣
此外,总平均值和计数必须转换为浮点数(小数时方差更大)
下面的例子是针对我的 10 年期国债利率表(没关系)
Select SQLFunction = Stdev([TR_Y10])
,ManualCalc = Sqrt(Sum(Power(((cast([TR_Y10] as float)-B.TotalAvg)),2) / B.TotalCnt))
,Variance = Stdev([TR_Y10]) - Sqrt(Sum(Power(((cast([TR_Y10] as float)-B.TotalAvg)),2) / B.TotalCnt))
From [Chinrus-Shared].[dbo].[DS_Treasury_Rates]
Join (Select TotalAvg=Avg(cast([TR_Y10] as float)),TotalCnt=count(*) From [Chinrus-Shared].[dbo].[DS_Treasury_Rates]) B on 1=1
退货
SQLFunction ManualCalc Variance
1.88409468982299 1.88395368060299 0.000141009220002264
于 2016-10-09T21:45:42.713 回答
0
标准差是方差除以 n 的平方根。
方差是平均值与观测值之差的平方和。
因此,在大多数数据库中,您可以使用窗口函数:
select sqrt(avg(var))
from (select square(t.x - avg(t.x) over ()) as var
from t
) t;
笔记:
- 该
square()
函数可能有一些其他名称(例如power()
)。 - 该
sqrt()
函数可能有其他名称。 - 一般来说,这不是计算标准偏差的好方法。特别是,这是一个数值不稳定的算法(它对于有限数量的正常数来说工作得很好)。
- 需要子查询,因为窗口函数不能作为聚合函数的参数。
于 2016-10-09T23:07:15.647 回答