ORACLE分析函数:
是一种对批量数据进行处理的函数。
举例说明:
例1:
查询出员工的姓名、工资、所在部门的平均工资,
要求显示出来的是工资大于部门平均工资的员工。
select p.* from (select ename,sal,avg(sal) over (partition by deptno) avg_sal
from emp) p where sal>avg_sal;
这就是批量处理的数据结果,所以分析函数用来进行批量处理数据效率很高。
例二:
求工资与奖金和占本部门每月所有员工工资与奖金和的20%以上的员工 。
select p.*,sal+nvl(comm,0) sal_comm,round((sal+nvl(comm,0))/p.sum_sal_nvl,2)*100||'%' from (select ename,empno,sal,comm,sum(sal+nvl(comm,0)) over (partition by deptno)
sum_sal_nvl from emp) p where sal+nvl(comm,0)>p.sum_sal_nvl*0.2;
例三:
查看一下emp表员工的工资数据,按降序排序:select empno,ename,sal from emp order by sal desc;
如果我们现在需要选出前三高的工资的人,并且重复的不算
按照rownumber排序:
select ename,empno,sal from (select ename,empno,sal from emp order by sal desc ) where
rownum<=3;
如图 因为SCOTT和FORD的工资都是3200所以按照ROWNUMBER排序并不能符合我们的要求。
所以现在我们采用分析函数的方法:
使用分析函数dense_rank()
选出前三的人:
select p.* from (select ename,empno,sal,dense_rank() over (order by sal desc) denserank from emp) p
where denserank<=3;
例四:
dense_rank()的另一种用法
过虑如下问题:需要求出工资排名第一和排名倒数第一的员工,如何解答?
select min(ename) keep(dense_rank first order by sal desc nulls last),
min(ename) keep(dense_rank last order by sal desc nulls last) from emp;
first和last限制位置,nulls last防止为空还在查询里的结果最前面。
