资源描述:
《sql over函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、oracle分析函数over的用法oracle分析函数over的用法分析函数,最早是从ORACLE8.1.6开始出现的,它的设计目的是为了解决诸如“累计计算”,“找出分组内百分比”,“前-N条查询”,“移动平均数计算”"等问题。其实大部分的问题都可以用PL/SQL解决,但是它的性能并不能达到你所期望的效果。分析函数是SQL言语的一种扩充,它并不是仅仅试代码变得更简单而已,它的速度比纯粹的SQL或者PL/SQL更快。现在这些扩展已经被纳入了美国国家标准化组织SQL委员会的SQL规范说明书中。分析函数是在一个记录行
2、分组的基础上计算它们的总值。与集合函数不同,他们返回各分组的多行记录。行的分组被称窗口,并通过分析语句定义。对于每记录行,定义了一个“滑动”窗口。该窗口确定“当前行”计算的范围。窗口的大小可由各行的实际编号或由时间等逻辑间隔确定。除了ORDERBY(按…排序)语句外,分析函数是一条查询被执行的操作。所有合并、WHERE、GROUPBY、HAVING语句都是分析函数处理之前完成的。因此,分析函数只出现在选择目录或ORDERBY(按…排序)语句中。前期数据准备: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()根据划分表达式设置的规则,PARTITIONBY(按…划分)将一个结果逻辑分成N个分组划分表达式。在此“划分”和“分组”用作同义词。分析函数独立应用于各个分组,并在应用时重置(按…排序)语句规定了每个分组(划分)的数据如何排序。
7、这必然影响分析函数的结果。窗口生成语句用以定义滑动或固定数据窗口,分析函数在分组内进行分析。该语句能够对分组中任意定义的滑动或固定窗口进行计算。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