Oracle分析函數(shù)入門
一、Oracle分析函數(shù)入門
分析函數(shù)是什么?
分析函數(shù)是Oracle專門用于解決復(fù)雜報(bào)表統(tǒng)計(jì)需求的功能強(qiáng)大的函數(shù),它可以在數(shù)據(jù)中進(jìn)行分組然后計(jì)算基于組的某種統(tǒng)計(jì)值,并且每一組的每一行都可以返回一個(gè)統(tǒng)計(jì)值。
分析函數(shù)和聚合函數(shù)的不同之處是什么?
普通的聚合函數(shù)用group by分組,每個(gè)分組返回一個(gè)統(tǒng)計(jì)值,而分析函數(shù)采用partition by分組,并且每組每行都可以返回一個(gè)統(tǒng)計(jì)值。
分析函數(shù)的形式
分析函數(shù)帶有一個(gè)開窗函數(shù)over(),包含三個(gè)分析子句:分組(partition by), 排序(order by), 窗口(rows) ,他們的使用形式如下:over(partition by xxx order by yyy rows between zzz)。
注:窗口子句在這里我只說rows方式的窗口,range方式和滑動(dòng)窗口也不提
分析函數(shù)例子(在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針對(duì)當(dāng)前所有記錄的前一條、后一條記錄,也就是表中的所有記錄
--unbounded:不受控制的,無限的
--preceding:在...之前
--following:在...之后
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL
FROM EMP E;
運(yùn)行結(jié)果:
示例目的:按照deptno分組,然后計(jì)算每組值的總和
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME) max_sal
FROM SCOTT.EMP;
運(yùn)行結(jié)果:
示例目的:對(duì)各部門進(jìn)行分組,并附帶顯示第一行至當(dāng)前行的匯總
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN unbounded preceding AND current row 是指第一行至當(dāng)前行的匯總
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_sal
FROM SCOTT.EMP;
運(yùn)行結(jié)果:
示例目標(biāo):當(dāng)前行至最后一行的匯總
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN current row AND unbounded following 指當(dāng)前行到最后一行的匯總
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) max_sal
FROM SCOTT.EMP;
運(yùn)行結(jié)果:
示例目標(biāo):當(dāng)前行的上一行(rownum-1)到當(dāng)前行的匯總
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN 1 preceding AND current row 是指當(dāng)前行的上一行(rownum-1)到當(dāng)前行的匯總
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME ROWS
BETWEEN 1 PRECEDING AND CURRENT ROW) max_sal
FROM SCOTT.EMP;
運(yùn)行結(jié)果:
示例目標(biāo): 當(dāng)前行的上一行(rownum-1)到當(dāng)前行的下輛行(rownum+2)的匯總
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN 1 preceding AND 1 following 是指當(dāng)前行的上一行(rownum-1)到當(dāng)前行的下輛行(rownum+2)的匯總
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) max_sal
FROM SCOTT.EMP;
運(yùn)行結(jié)果:
posted on 2015-05-13 00:46 奮斗成就男人 閱讀(379) 評(píng)論(0) 編輯 收藏 所屬分類: SQL