ORALC的STDDEV、STDDEV_POP、STDDEV_SAMP等函數

今天一個同事碰到一個問題:用SQL求一個指標的計算公式:其中Xi即指標,X指標均值,N是指標個數,看到這樣的計算公式確實比較發愁。在處理問題前,先去惡補了下數理統計方面的知識(數理統計的知識基本上都還給老師了):方差、標準差、平均值.....


隨機變量是指變量的值無法預先確定僅以一定的可能性(概率)取值的量。它是由於隨機而獲得的非確定值,是概率中的一個基本概念。

 

樣本方差 :樣本中各數據與樣本平均數的差的平方和的平均數叫樣本方差。

 

樣本標準差:樣本方差的算術平方根叫做樣本標準差。

 

 樣本方差和樣本標準差都是衡量一個樣本波動大小的量,樣本方差或樣本標準差越大,樣本數據的波動就越大。 數學上一般用E{[X-E(X)]^2}來度量隨機變量X與其均值E(X)即期望的偏離程度,稱爲X的方差。標準偏差公式:S = Sqrt[(∑(xi-x撥)^2) /N]公式中∑代表總和,x撥代表x的均值,^2代表二次方,Sqrt代表平方根。 

 

假設有一組數值 x1, ..., xN (皆爲實數),其平均值爲:  

 

 此組數值的標準差爲: 

 一隨機變量X 的標準差定義爲:  

 

 須注意並非所有隨機變量都具有標準差,因爲有些隨機變量不存在期望值。 如果隨機變量 X 爲 x1,...,xN 具有相同機率,則可用上述公式計算標準差。從一大組數值當中取出一樣本數值組合 x1,...,xn ,常定義其樣本標準差:

 

到這裏估計有些人犯迷糊了,到底標準差是哪個呢?到底是除以n還是n-1呢? (糾結這個也是由於後面的ORACLE函數而必須糾結),當時也是看見有些資料說標準差是這個,有些是哪個. 其實第一個公式是對一組固定數值而言,而第二歌公式是從隨機變量隨機抽樣的N個樣本(目前我是這樣理解的,不知道對錯與否)。

 

接下來我想找找ORACLE裏面有沒有這樣的數學函數。剛開始想到STDDEV(DISTINCT|ALL)函數,ALL表示對所有的值求求標準偏差,DISTINCT表示只對不同的值求標準差,對於STDDEV、STDDEV_POP、STDDEV_SAMP這三者之間查別,也是一知半解:查看用戶手冊:定義如下所示:(水平有限,翻譯不當,敬請指出)

 

複製代碼
STDDEV returns sample standard deviation of expr, a set of numbers. You can use it as both an aggregate and analytic function. It differs from STDDEV_SAMP in that STDDEV returns zero when it has only 1 row of input data, whereas STDDEV_SAMP returns a null.
Oracle calculates the standard deviation 
as the square root of the variance defined for the VARIANCE aggregate function.,

 

翻譯如下:STDDEV返回樣本標準差表達式 ,你可以用它作爲聚合或分析函數。它不同於STDDEV_SAMP函數,當只有一行數據時,STDDEV返回0, 而STDDEV_SAMP返回null值。 ORACLE用VARIANCE聚合函數的算術平方根來計算標準方差

 
 
STDDEV_POP computes the population standard deviation and returns the square root of the population variance. You can use it as both an aggregate and analytic function.
The expr 
is a number expression, and the function returns a value of type NUMBER. This function is the same as the square root of the VAR_POP functionWhen VAR_POP returns null, this function returns null.

翻譯如下:STDDEV_POP計算總體標準差(機器翻譯,不知道準不準。其實就是計算一組已經定下來數值的標準差,而不是抽樣-樣本) ,返回方差的算術平方根。你可以用它作爲分析或聚合函數。表達式是數值,則函數返回NUMBER類型的值,函數等效於VAR_POP函數的算術平方根。 當VAR_POP函數返回null,STDDEV_POP函數返回null值。

 

 
STDDEV_SAMP computes the cumulative sample standard deviation and returns the square root of the sample variance. You can use it as both an aggregate and analytic function.
The expr 
is a number expression, and the function returns a value of type NUMBER. This function is same as the square root of the VAR_SAMP functionWhen VAR_SAMP returns null, this function returns null.

 

翻譯如下:STDDEV_SAMP函數計算樣本標準差,返回樣本方差的算術平方根。你可以用它作爲聚合函數和分析函數。

當表達式是數值類型,函數返回NUMBER類型的數值。這個函數等效於函數VAR_SAM的平方根。當VAR_SAMP返回null值,它也返回null值。 

複製代碼

 

其實到目前,我們知道了STDDEV與STDDEV_SAMP基本上是一致的。只是當只有一行數據時,返回的值不同而已,但是我們對STDDEV_POP與STDDEV之間區別還是不太清楚。只好硬着頭皮寫SQL腳本來驗證一下這兩個函數了。我們現在做個試驗,假設SCOTT.EMP表的工資字段就是我們所要求的指標,我們要求SAL字段的標準方差,下面用最原始的SQL腳本來模擬一下吧。

 

--方法1
SELECT SQRT(SUM(SAL)/MAX(CNT)) FROM ( SELECT POWER((SAL - AVG(SAL) OVER()),2) AS SAL,COUNT(1) OVER() AS CNT FROM SCOTT.EMP ) ;
 
--方法2SELECT SQRT(SUM( POWER((SAL - (SELECT AVG(SAL) FROM SCOTT.EMP)), 2)
       /(SELECT COUNT(1) FROM SCOTT.EMP)))
FROM SCOTT.EMP

 

接下來我們來看看用STDDEV、STDDEV_POP函數計算的結果。從下圖你就可以知道STDDEV_POP是哪個計算公式了吧。呵呵

 

 那麼STDDEV的計算公式是什麼呢?我測試發現其實STDDEV的標準差計算公式是

SELECT SQRT(SUMPOWER((SAL - (SELECT AVG(SAL) FROM SCOTT.EMP)), 2)
       
/((SELECT COUNT(1FROM SCOTT.EMP) -1)))
FROM SCOTT.EMP;


 

它們是等效的。有興趣的可以試試。到此我麼可以看出這幾個ORACLE函數的計算公式:

 

               STDDEV_POP                                                STDDEV                              

 

 另外附上其它幾個也不太常用的函數:

CORR
功能描述:返回一對表達式的相關係數,它是如下的縮寫:
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
VARIANCE
功能描述:返回一對表達式的樣本方差 SQRT(VARIANCE(expr)) = STDEV(expr)

 

COVAR_POP
功能描述:返回一對表達式的方差。   SQRT(COVAR_POP(expr)) = STDDEV_POP(expr)
COVAR_SAMP
功能描述:返回一對表達式的樣本方差 SQRT(VOVAR_SAMP(expr)) = STDDEV_SAMP(expr)

轉自:http://www.cnblogs.com/kerrycode/archive/2011/06/03/2063860.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章