程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> ORACLE進階之三:分析函數

ORACLE進階之三:分析函數

編輯:Oracle數據庫基礎

有時候我們需要從DB中提取一些很復雜的數據,而標准SQL卻對此無能為力,或者是執行效率非常的低;比如我們需要提取如下數據:
    逐行顯示各個部門的累計工資,每行包括部門內前面所有人的工資總和;
    查找各個部門工資最高的前N個人;
    ……

語法
 Function名稱([參數]) OVER ([partition 子句][ order 子句] [window 子句])
  OVER為分析函數的關鍵字,用於區別普通的聚合函數;從語法格式上區分的話,沒加over()即時聚合函數,加了over()就是分析函數。
 Partition 子句:Partition by exp1[ ,exp2]...;
  主要用於分組,可以理解成select中的group by;不過它跟select語句後跟的group by 子句並不沖突;指定該子句之後,前面的函數起效范圍就是該分組內,若不指定,則Function的起效范圍是全部結果集。
 Order 子句:Order by exp1[asc|desc] [ ,exp2 [asc|desc]]... [nulls first|last];
  其參數基本與select中的order by相同;Nulls first|last是用來限定nulls在分組序列中的所在位置的,我們知道Oracle中對於null的定義是未知,所以默認order by的時候nulls總會被排在最前面。如果想控制值為null的行顯示位置,nulls first|last參數就能派上用場了。
 Window 子句:該子句的語法比較復雜,具體可以見下圖;

  該子句給出了一個定義變化或者固定的數據窗口方法,分析函數將對這些數據進行操作;默認情況下,一般用不上該子句,分析函數產生一個固定的窗口,影響的數據范圍是從第一行到當前行,其效果和RANGE BETWEEN UNDOUNDED PRECEDING AND CURRENT ROW一樣;若需要指定操作數據為當前行及其前兩行,則可以用ROWS 2 PRECEDING來實現其效果;
 其中用[]標注的子句都可以為空,一個最簡單的分析函數可能是COUNT(*) OVER ();

樣例
逐行顯示各個部門的累計工資,每行包括部門內前面所有人的工資總和:
SELECT EMP_NO,
       NAME,
       DEPT_NO,
       SUM(SAL) OVER(PARTITION BY DEPT_NO ORDER BY EMP_NO) DEPT_SAL_SUM
  FROM EMP
 ORDER BY DEPT_NO, EMP_NO;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved