什么是over函数?
over函数简单说就是给Oracle的分析函数加条件,而比较常见的就是结合sum(),rank()函数使用
sum() over
select empno, ename, deptno, sal, sum(sal) over (partition by deptno) as depsal from scott.emp;
结果如图:
这句sql中,我们根据部门编号对部门进行了分区,然后根据分区,求出每个部分的工资总和
我们给上面的这条sql再加一个 order by
select empno, ename, deptno, sal, sum(sal) over (partition by deptno order by sal) as depsal from scott.emp;
结果如图:
可以看到,每个部门中的员工按照工资从低到高进行了排序
rank() over
rank 函数是分级函数,这个函数必须与over函数一起使用,否则会报错:缺少窗口函数
我们先来看一段sql
select empno, sal, job, rank() over(partition by job order by sal desc) as sallevel from scott.emp;
结果如图:
我们可以清楚的看到,每个部门岗位不同薪资的排名情况
rank 函数
作为聚合函数
示例:
select rank(2000) within group(order by sal desc) as rank from scott.emp;
该sql可以计算出薪水为2000的员工,按照薪水从高到低的一个排名
作为分析函数
示例:
select ename, sal, rank() over(order by sal desc) as rank from scott.emp;
该sql将公司内员工的工资从高到低的排序
rank 和 dense_rank的区别
rank:如果有5个人,其中有两个人的排名一样,则返回类似以下结果:1,2,2,4,5
dense_rank:如果有5个人,其中有两个人的排名一样,则返回类似以下结果:1,2,2,3,4