Oracle 9i 分析函數(shù)參考手冊
Oracle從8.1.6開始提供分析函數(shù),分析函數(shù)用于計算基于組的某種聚合值,它和聚合函數(shù)的不同之處是對于每個組返回多行,而聚合函數(shù)對于每個組只返回一行。
下面例子中使用的表來自O(shè)racle自帶的HR用戶下的表,如果沒有安裝該用戶,可以在SYS用戶下運行$ORACLE_HOME/demo/schema/human_resources/hr_main.sql來創(chuàng)建。
少數(shù)幾個例子需要訪問SH用戶下的表,如果沒有安裝該用戶,可以在SYS用戶下運行$ORACLE_HOME/demo/schema/sales_history/sh_main.sql來創(chuàng)建。
如果未指明缺省是在HR用戶下運行例子。
開窗函數(shù)的的理解:
開窗函數(shù)指定了分析函數(shù)工作的數(shù)據(jù)窗口大小,這個數(shù)據(jù)窗口大小可能會隨著行的變化而變化,舉例如下:
over(order by salary) 按照salary排序進行累計,order by是個默認的開窗函數(shù)
over(partition by deptno)按照部門分區(qū)
over(order by salary range between 50 preceding and 150 following)
每行對應(yīng)的數(shù)據(jù)窗口是之前行幅度值不超過50,之后行幅度值不超過150
over(order by salary rows between 50 preceding and 150 following)
每行對應(yīng)的數(shù)據(jù)窗口是之前50行,之后150行
over(order by salary rows between unbounded preceding and unbounded following)
每行對應(yīng)的數(shù)據(jù)窗口是從第一行到最后一行,等效:
over(order by salary range between unbounded preceding and unbounded following)
主要參考資料:《expert one-on-one》 Tom Kyte 《Oracle9i SQL Reference》第6章
AVG
功能描述:用于計算一個組和數(shù)據(jù)窗口內(nèi)表達式的平均值。
SAMPLE:下面的例子中列c_mavg計算員工表中每個員工的平均薪水報告,該平均值由當(dāng)前員工和與之具有相同經(jīng)理的前一個和后一個三者的平均數(shù)得來;
SELECT manager_id, last_name, hire_date, salary,
AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg
FROM employees;
MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG
---------- ------------------------- --------- ---------- ----------
100 Kochhar 21-SEP-89 17000 17000
100 De Haan 13-JAN-93 17000 15000
100 Raphaely 07-DEC-94 11000 11966.6667
100 Kaufling 01-MAY-95 7900 10633.3333
100 Hartstein 17-FEB-96 13000 9633.33333
100 Weiss 18-JUL-96 8000 11666.6667
100 Russell 01-OCT-96 14000 11833.3333
.
.
.
CORR
功能描述:返回一對表達式的相關(guān)系數(shù),它是如下的縮寫:
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
從統(tǒng)計上講,相關(guān)性是變量之間關(guān)聯(lián)的強度,變量之間的關(guān)聯(lián)意味著在某種程度
上一個變量的值可由其它的值進行預(yù)測。通過返回一個-1~1之間的一個數(shù), 相關(guān)
系數(shù)給出了關(guān)聯(lián)的強度,0表示不相關(guān)。
SAMPLE:下例返回1998年月銷售收入和月單位銷售的關(guān)系的累積系數(shù)(本例在SH用戶下運行)
SELECT t.calendar_month_number,
CORR (SUM(s.amount_sold), SUM(s.quantity_sold))
OVER (ORDER BY t.calendar_month_number) as CUM_CORR
FROM sales s, times t
WHERE s.time_id = t.time_id AND calendar_year = 1998
GROUP BY t.calendar_month_number
ORDER BY t.calendar_month_number;
|
|