ORACLE分组函数stddev和variance,我心存的疑问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE分组函数stddev和variance,我心存的疑问相关的知识,希望对你有一定的参考价值。

 

方差函数VARIANCE(x),
具体方法是: 
设方差s,a为x1,x2...xn的平均值 ,
则s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+……(xn-a)^2]/n 

标准差函数STDDEV(x),
具体算法是: 
方差开方。
设标准查为& ,则 &^2 = s

但是我通过以下的实验,发现oracle是这样计算variance()的, 
s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+……(xn-a)^2]/n-1 ,注意不是除以n,而是n-1 
-----------------------------------------------------------------------------------
实验:
create table TEST_STDDEV_VARIANCE(col1 number(9,2),col2 number(9,2)) ;
insert into TEST_STDDEV_VARIANCE values(1,1) ;
insert into TEST_STDDEV_VARIANCE values(2,3) ;
insert into TEST_STDDEV_VARIANCE values(3,9) ;
insert into TEST_STDDEV_VARIANCE values(4,15) ;
SELECT * FROM TEST_STDDEV_VARIANCE ;
COL1   COL2
-----  -----
1           1
2           3
3           9
4           15

SELECT VARIANCE(COL1) ,VARIANCE(COL2) FROM TEST_STDDEV_VARIANCE ;
VARIANCE(COL1)                            VARIANCE(COL2)
----------------------------------------       --------
1.66666666666666666666666666666666666667           40

SELECT STDDEV(COL1) ,STDDEV(COL2) FROM TEST_STDDEV_VARIANCE ;
STDDEV(COL1)                                        STDDEV(COL2) 
--------------------------------------------------       --------
1.29099444873580562839308846659413320361                 6.32455532033675866399778708886543706744

注意VARIANCE(COL1)=(1.5^2 + 0.5^2 + 0.5^2 + 1.5^2) /3 = 5/3 =1.66666666666666666666666666666666666667
而如果按照方差公式计算应该是VARIANCE(COL1)=(1.5^2 + 0.5^2 + 0.5^2 + 1.5^2) /4 =5/4=1.25
为什么oracle的分组函数的计算公式不是[(x1-a)^2+(x2-a)^2+(x3-a)^2+……(xn-a)^2]/n ,而是
s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+……(xn-a)^2]/n-1  呢,真有点疑问,有知道的高手请指点。


以上是关于ORACLE分组函数stddev和variance,我心存的疑问的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库—— 分组函数

SQL 基础之组函数

Spark2 DataFrame数据框常用操作之统计指标:mean均值,variance方差,stddev标准差,corr(Pearson相关系数),skewness偏度,kurtosis峰度((代码

Oracle STDDEV函数

第十章 SQL聚合函数 STDDEV, STDDEV_SAMP, STDDEV_POP

第十二章 SQL聚合函数 VARIANCE, VAR_SAMP, VAR_POP