分析函数
员工表查询:
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;