分析函数

员工表查询:

1:查询每个部门的工资按工资排序;

1 select 
2 SAL 工资,
3 DEPTNO 部门,
4 ENAME 姓名,
5 ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) 工资在本部门排序
6  from EMP

 2:分组的时候 PARTITION BY 后面可以跟多个条件。

3:求每个部门工资最高的信息

select * from (SELECT ENAME,SAL,DEPTNO,RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) MM FROM EMP) WHERE MM=1

小知识:用rank()不用ROW_NUMBER()的原因是:因为如果同班有两个并列第一,row_number()只返回一个结果

2.rank()和dense_rank()的区别是: 

      --rank()是跳跃排序,有两个第二名时接下来就是第四名 
      --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名 
  
SELECT DEPTNO,
              dense_rank() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW,
              ENAME,
              SAL
              FROM EMP
              WHERE DEPTNO='30'

SELECT DEPTNO,
              rank() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW,
              ENAME,
              SAL
              FROM EMP
              WHERE DEPTNO='30'

SELECT DEPTNO,
              ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW,
              ENAME,
              SAL
              FROM EMP
              WHERE DEPTNO='30'

4:求个人在本部门的工资百分比
select ENAME,DEPTNO,sal,sal*100/sum(sal) over(partition by DEPTNO) percent from EMP WHERE ENAME='ALLEN';  

select ENAME,DEPTNO,sal,sal*100/sum(sal) over(partition by DEPTNO) percent from EMP;  

 5:lag()与lead():求之前或之后的第N行
lag和lead函数可以在一次查询中取出同一字段的前n行的数据和后n行的值。这种操作可以使用对相同表的表连接来实现,不过使用lag和lead有更高的效率。
lag(arg1,arg2,arg3)
第一个参数是列名,
第二个参数是偏移的offset,
第三个参数是超出记录窗口时的默认值。

select  ENAME,SAL,lag(ENAME,4,0) OVER(ORDER BY SAL) FROM EMP;

select  ENAME,SAL,lead(ENAME,4,0) OVER(ORDER BY SAL) FROM EMP;

原文地址:https://www.cnblogs.com/bulrush/p/7591442.html