什么是oracle的分析函数呢,我相信大家一定见过这样的语法“Analytic_function(arg1,arg2,...) OVER(analytic_clause)” ,一般带个over什么的语法。
oracle官方的语法解释就是
如果非要有个例子:
sum(sal) over (partition by deptno order by ename RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) new_alias
“RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW”是默认的windowing_clause。从第一行到当前行(如果over里面加上order by 根据升序或者降序不同,这个第一行定义也不一样。就像我们觉得周日是一周最后一天,老外认为周日是一周第一天)
通过这个例子,我相信大家应该能对号入座了。
其实光说这个也没有什么例子,今天我就通过一个例子给大家介绍下。先看看测试环境吧
测试就要oracle带的例子好了。先看看这个能写出的语法
SELECT
t.empno,t.ename,t.deptno,t.hiredate,t.sal,
SUM(t.sal) OVER (PARTITION BY t.deptno ORDER BY t.hiredate) sum_sal1,
SUM(t.sal) OVER (PARTITION BY t.deptno ORDER BY t.hiredate DESC) sum_sal2,
SUM(t.sal) OVER (PARTITION BY t.deptno ) sum_sal7,
SUM(t.sal) OVER ( ) sum_sal8
--FROM emp t order by t.deptno,t.hiredate DESC; 这个where后面就先不要加上order by了,加上效果有变化
FROM emp t order ;
一:sun_sal1和sun_sal2说明
sum_sal1:计算当第一行到当前行之间所有sal总和
sum_sal2:计算最后一行到当前行之间所有sql总和。加上"ORDER BY t.hiredate DESC" Oracle认为最后原来的最后
一行就是第一行了。(RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 还是"第一
行"到当前行,第一的定义变化了)
这个2列语法上面唯一的差别就是排序不一样,一个走默认 一个走desc
二:sum_sal7和sum_sal8
sum_sal7:没有over里面的order by了,计算的是组的总和,整个depe_id=20的sal总和
sum_sal8:over里面什么也没有,计算真个结果集的sal总和