Oracle分析函式之開窗函式over()詳解

pentium發表於2019-03-15

分析函式是什麼?
分析函式是Oracle專門用於 解決複雜報表統計需求 的功能強大的函式, 它可以在資料中進行分組然後計算基於組的某種統計值 ,並且每一組的每一行都可以返回一個統計值。

          

分析函式和聚合函式的不同之處是什麼?
普通的聚合函式用group by分組, 每個分組 返回一個統計值,而分析函式採用partition by分組,並且 每組每行 都可以返回一個統計值。

              

分析函式的形式
分析函式帶有一個開窗函式over(),包含三個分析子句:分組(partition by), 排序(order by), 視窗(rows) ,他們的使用形式如下:over(partition by xxx order by yyy rows between zzz)。
注:視窗子句在這裡我只說rows方式的視窗,range方式和滑動視窗也不提

    

分析函式例子(在scott使用者下模擬)

示例目的:顯示各部門員工的工資,並附帶顯示該部分的最高工資。

--顯示各部門員工的工資,並附帶顯示該部分的最高工資。SELECT E.DEPTNO,
       E.EMPNO,
       E.ENAME,
       E.SAL,
       LAST_VALUE(E.SAL) 
       OVER(PARTITION BY E.DEPTNO 
            ORDER BY E.SAL ROWS 
            --unbounded preceding and unbouned following針對當前所有記錄的前一條、後一條記錄,也就是表中的所有記錄            --unbounded:不受控制的,無限的            --preceding:在...之前            --following:在...之後            BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL  FROM EMP E;

執行結果:

               

示例目的:按照deptno分組,然後計算每組值的總和

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,       SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME) max_sal  FROM SCOTT.EMP;

執行結果:

     

示例目的:對各部門進行分組,並附帶顯示第一行至當前行的彙總

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,       --注意ROWS BETWEEN unbounded preceding AND current row  是指第一行至當前行的彙總       SUM(SAL) OVER(PARTITION BY DEPTNO 
                     ORDER BY ENAME 
                     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_sal  FROM SCOTT.EMP;

執行結果:

   

示例目標:當前行至最後一行的彙總

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,       --注意ROWS BETWEEN current row AND unbounded following 指當前行到最後一行的彙總       SUM(SAL) OVER(PARTITION BY DEPTNO 
                     ORDER BY ENAME 
                     ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) max_sal  FROM SCOTT.EMP;

執行結果:

   

 示例目標:當前行的上一行(rownum-1)到當前行的彙總

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,       --注意ROWS BETWEEN 1 preceding AND current row 是指當前行的上一行(rownum-1)到當前行的彙總        SUM(SAL) OVER(PARTITION BY DEPTNO 
                     ORDER BY ENAME ROWS 
                     BETWEEN 1 PRECEDING AND CURRENT ROW) max_sal  FROM SCOTT.EMP;

執行結果:

    

示例目標:   當前行的上一行(rownum-1)到當前行的下輛行(rownum+2)的彙總     

SELECT EMPNO,
       ENAME,
       DEPTNO,
       SAL,       --注意ROWS BETWEEN 1 preceding AND 1 following 是指當前行的上一行(rownum-1)到當前行的下輛行(rownum+2)的彙總       SUM(SAL) OVER(PARTITION BY DEPTNO 
                     ORDER BY ENAME 
                     ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) max_sal  FROM SCOTT.EMP;

執行結果:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14377/viewspace-2638439/,如需轉載,請註明出處,否則將追究法律責任。

相關文章