【Oracle 11g】(八) 分析函数、开窗函数

Posted on 2021-08-31 16:26  MissRong  阅读(323)  评论(0)    收藏  举报

【Oracle 11g】(八) 分析函数、开窗函数

over()是开窗函数,

over()可以区分avg()是聚合函数还是分析函数。

分析函数由聚合函数和开窗函数组成的。

一、聚合函数+开窗函数

--需求-1:
--查询出员工的姓名、工资、所在部门的平均工资,
--要求显示出来的是工资大于部门平均工资的员工。

--1)连接查询的方式
SELECT e.empno, e.ename, e.sal, t.avg_sal
FROM emp e, (SELECT deptno, AVG(sal) as avg_sal 
             from emp
             GROUP BY deptno
             )t
WHERE e.deptno = t.deptno AND avg_sal < e.sal;

--2)分析函数--聚合函数+开窗函数
SELECT *
FROM(
SELECT empno, ename, sal, deptno, 
       AVG(sal)OVER(PARTITION BY deptno) as avg_sal 
FROM emp
ORDER BY deptno
)t
WHERE avg_sal < sal; 

        

------- -------- ------ ------- ------- ------- -------- ------ ------- -------

--需求-3:
--按照部门求出各部门员工总薪水、所有员工薪水总和、按部门累计求和员工薪水
SELECT empno,ename,sal,comm,deptno,
       SUM(sal)OVER(PARTITION BY deptno)sum_sal,
       SUM(sal)OVER()sum_sal,
       SUM(sal)OVER(PARTITION BY deptno ORDER BY sal) leiji_sumsal  --累计求和
FROM emp;

二、等级函数+开窗函数

--需求-3:
--查询出员工表中,工资排名前3位
--三种排名函数
SELECT * 
FROM(
SELECT e.empno, e.ename, e.sal, 
       rank()over(order by sal desc) rank_sal,             --排名可重复且有跳位   eg:1 2 2 4
       dense_rank()over(order by sal desc) dense_rank_sal, --排名可重复且没有跳位  eg:1 2 2 3
       row_number()over(order by sal desc) row_number_sal  --排名无重复情况       eg:1 2 3 4
FROM emp e
)t
WHERE dense_rank_sal <= 3;

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3