資源描述:
《sql over函數(shù)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、oracle分析函數(shù)over的用法oracle分析函數(shù)over的用法分析函數(shù),最早是從ORACLE8.1.6開始出現(xiàn)的,它的設(shè)計目的是為了解決諸如“累計計算”,“找出分組內(nèi)百分比”,“前-N條查詢”,“移動平均數(shù)計算”"等問題。其實大部分的問題都可以用PL/SQL解決,但是它的性能并不能達到你所期望的效果。分析函數(shù)是SQL言語的一種擴充,它并不是僅僅試代碼變得更簡單而已,它的速度比純粹的SQL或者PL/SQL更快。現(xiàn)在這些擴展已經(jīng)被納入了美國國家標準化組織SQL委員會的SQL規(guī)范說明書中。分析函數(shù)是在一個記錄行
2、分組的基礎(chǔ)上計算它們的總值。與集合函數(shù)不同,他們返回各分組的多行記錄。行的分組被稱窗口,并通過分析語句定義。對于每記錄行,定義了一個“滑動”窗口。該窗口確定“當前行”計算的范圍。窗口的大小可由各行的實際編號或由時間等邏輯間隔確定。除了ORDERBY(按…排序)語句外,分析函數(shù)是一條查詢被執(zhí)行的操作。所有合并、WHERE、GROUPBY、HAVING語句都是分析函數(shù)處理之前完成的。因此,分析函數(shù)只出現(xiàn)在選擇目錄或ORDERBY(按…排序)語句中。前期數(shù)據(jù)準備:createtableEMP(ENAMEVARCHAR
3、2(10),DEPTNOVARCHAR2(2),SALNUMBER(10))insertintoEMP(ENAME,DEPTNO,SAL)values('CLARK','10',2450);insertintoEMP(ENAME,DEPTNO,SAL)values('MILLER','10',1300);insertintoEMP(ENAME,DEPTNO,SAL)values('KING','10',5000);insertintoEMP(ENAME,DEPTNO,SAL)values('FORD','20'
4、,3000);insertintoEMP(ENAME,DEPTNO,SAL)values('ADAMS','20',1100);insertintoEMP(ENAME,DEPTNO,SAL)values('JONES','20',2975);insertintoEMP(ENAME,DEPTNO,SAL)values('SCOTT','20',3000);insertintoEMP(ENAME,DEPTNO,SAL)values('SMITH','20',800);insertintoEMP(ENAME,DEPT
5、NO,SAL)values('ALLEN','30',1600);insertintoEMP(ENAME,DEPTNO,SAL)values('BLAKE','30',2850);insertintoEMP(ENAME,DEPTNO,SAL)values('JAMES','30',950);insertintoEMP(ENAME,DEPTNO,SAL)values('TURNER','30',1500);insertintoEMP(ENAME,DEPTNO,SAL)values('MARTIN','30',12
6、50);insertintoEMP(ENAME,DEPTNO,SAL)values('WARD','30',1250);commit;TheSyntax句法:OVER()根據(jù)劃分表達式設(shè)置的規(guī)則,PARTITIONBY(按…劃分)將一個結(jié)果邏輯分成N個分組劃分表達式。在此“劃分”和“分組”用作同義詞。分析函數(shù)獨立應用于各個分組,并在應用時重置(按…排序)語句規(guī)定了每個分組(劃分)的數(shù)據(jù)如何排序。
7、這必然影響分析函數(shù)的結(jié)果。窗口生成語句用以定義滑動或固定數(shù)據(jù)窗口,分析函數(shù)在分組內(nèi)進行分析。該語句能夠?qū)Ψ纸M中任意定義的滑動或固定窗口進行計算。Example:CalculatearunningTotal例:累計計算:本例中對某部門的工資進行逐行計算,每行包括之前所有行中工資的合計。SELECTename"Ename",deptno"Deptno",sal"Sal",SUM(sal)OVER(ORDERBYdeptno,ename)"RunningTotal",SUM(SAL)OVER(PARTITIONBYd
8、eptnoORDERBYename)"DeptTotal",ROW_NUMBER()OVER(PARTITIONBYdeptnoORDERBYENAME)"Seq"FROMempORDERBYdeptno,ename/EnameDeptnoSalRunningTotalDeptTotalSeq---------------------------------------------CL