1. 程式人生 > >ORACLE分組函數stddev和variance,我心存的疑問

ORACLE分組函數stddev和variance,我心存的疑問

x2-a

方差函數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,我心存的疑問