yxhxj2006

          常用鏈接

          統(tǒng)計

          最新評論

          Oracle分析函數(shù)入門

          一、Oracle分析函數(shù)入門

          分析函數(shù)是什么?
          分析函數(shù)是Oracle專門用于解決復(fù)雜報表統(tǒng)計需求的功能強大的函數(shù),它可以在數(shù)據(jù)中進行分組然后計算基于組的某種統(tǒng)計值,并且每一組的每一行都可以返回一個統(tǒng)計值。

                    

          分析函數(shù)和聚合函數(shù)的不同之處是什么?
          普通的聚合函數(shù)用group by分組,每個分組返回一個統(tǒng)計值,而分析函數(shù)采用partition by分組,并且每組每行都可以返回一個統(tǒng)計值。

                        

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

              

          分析函數(shù)例子(在scott用戶下模擬)

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

          復(fù)制代碼
          --顯示各部門員工的工資,并附帶顯示該部分的最高工資。
          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;
          復(fù)制代碼

          運行結(jié)果:

                         

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

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

          運行結(jié)果:

               

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

          復(fù)制代碼
          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;
          復(fù)制代碼

          運行結(jié)果:

             

          示例目標:當前行至最后一行的匯總

          復(fù)制代碼
          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;
          復(fù)制代碼

          運行結(jié)果:

             

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

          復(fù)制代碼
          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;
          復(fù)制代碼

          運行結(jié)果:

              

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

          復(fù)制代碼
          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;
          復(fù)制代碼

          運行結(jié)果:


          posted on 2015-05-13 00:46 奮斗成就男人 閱讀(380) 評論(0)  編輯  收藏 所屬分類: SQL

          主站蜘蛛池模板: 五指山市| 河间市| 安宁市| 南召县| 砀山县| 日喀则市| 沅江市| 星子县| 巫溪县| 榆社县| 连云港市| 苍南县| 宝山区| 固阳县| 斗六市| 望都县| 滦南县| 泽库县| 富川| 泾川县| 万宁市| 冷水江市| 太湖县| 敦煌市| 栾川县| 青龙| 内黄县| 奉贤区| 汉川市| 肃宁县| 永修县| 普格县| 卢氏县| 县级市| 昆山市| 莲花县| 广饶县| 滨州市| 遂宁市| 广宁县| 崇左市|