SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO FROM SCOTT.EMP E, (SELECT E.DEPTNO, MAX(E.SAL) SAL FROM SCOTT.EMP E GROUPBY E.DEPTNO) ME WHERE E.DEPTNO = ME.DEPTNO AND E.SAL = ME.SAL;
使用Over()函数:
方法一:
1 2 3 4 5 6 7 8
SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO FROM (SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO, RANK() OVER(PARTITIONBY E.DEPTNO ORDERBY E.SAL DESC) RANK --在按部门划分的基础上,工资从高到低分级,级别RANK从1开始依次递增 FROM EMP E) E WHERE E.RANK =1 ;
方法二:
1 2 3 4 5 6 7 8
SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO FROM (SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO, DENSE_RANK() OVER(PARTITIONBY E.DEPTNO ORDERBY E.SAL DESC) RANK FROM EMP E) E WHERE E.RANK =1;
对比查询结果:左边的是用一般的方法查询结果,右边的是分析函数查询结果(两种方法结果相同)
min()/max() over(partition by …)
查询员工信息的同时,查询员工工资与所在部门最低、最高工资的差额
1 2 3 4 5 6 7 8 9 10 11 12
SELECT E.ENAME, E.JOB, E.SAL, E.DEPTNO, E.SAL - ME.MIN_SAL DIFF_MIN_SAL, ME.MAX_SAL - E.SAL DIFF_MAX_SAL FROM SCOTT.EMP E, (SELECT E.DEPTNO, MIN(E.SAL) MIN_SAL, MAX(E.SAL) MAX_SAL FROM SCOTT.EMP E GROUPBY E.DEPTNO) ME WHERE E.DEPTNO = ME.DEPTNO ORDERBY E.DEPTNO, E.SAL;
MAX() OVER(PARTITION BY .. ORDER BY .. DESC) 排序规则只能为desc,否则不起作用,将查询到目前为止排序值最高字段的对应值 MIN() OVER(PARTITION BY .. ORDER BY .. ASC ) 排序规则只能为asc,否则不起作用,将查询到目前为止排序值最低的字段的对应值,
SELECT E.DEPTNO, E.EMPNO, E.ENAME, E.SAL, LAST_VALUE(E.SAL) OVER(PARTITIONBY E.DEPTNO ORDERBY E.SAL ROWS/*MAX(E.SAL) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL ROWS*/ --unbounded preceding and unbouned following针对当前所有记录的前一条、后一条记录,也就是表中的所有记录 --unbounded:不受控制的,无限的 --preceding:在...之前 --following:在...之后 BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL FROM EMP E;
结果如下:
写法二:
1 2 3 4 5 6 7
SELECT E.DEPTNO, E.EMPNO, E.ENAME, E.SAL, MAX(E.SAL) OVER(PARTITIONBY E.DEPTNO /*ORDER BY E.SAL*/) MAX_SAL FROM EMP E;
示例2:对各部门进行分组,并附带显示第一行至当前行的汇总
1 2 3 4 5 6 7 8 9
SELECT EMPNO, ENAME, DEPTNO, SAL, --注意ROWS BETWEEN unbounded preceding AND current row 是指第一行至当前行的汇总 SUM(SAL) OVER(PARTITIONBY DEPTNO ORDERBY ENAME ROWSBETWEEN UNBOUNDED PRECEDING ANDCURRENTROW) max_sal FROM SCOTT.EMP;
结果如下:
示例3:当前行至最后一行的汇总
1 2 3 4 5 6 7 8 9
SELECT EMPNO, ENAME, DEPTNO, SAL, --注意ROWS BETWEEN current row AND unbounded following 指当前行到最后一行的汇总 SUM(SAL) OVER(PARTITIONBY DEPTNO ORDERBY ENAME ROWSBETWEENCURRENTROWAND UNBOUNDED FOLLOWING) max_sal FROM SCOTT.EMP;
结果如下:
示例4:当前行的上一行(rownum-1)到当前行的汇总
1 2 3 4 5 6 7 8 9
SELECT EMPNO, ENAME, DEPTNO, SAL, --注意ROWS BETWEEN 1 preceding AND current row 是指当前行的上一行(rownum-1)到当前行的汇总 SUM(SAL) OVER(PARTITIONBY DEPTNO ORDERBY ENAME ROWS BETWEEN1 PRECEDING ANDCURRENTROW) max_sal FROM SCOTT.EMP;
结果如下:
示例5:当前行的上一行(rownum-1)到当前行的下两行(rownum+2)的汇总
1 2 3 4 5 6 7 8 9
SELECT EMPNO, ENAME, DEPTNO, SAL, --注意ROWS BETWEEN 1 preceding AND 1 following 是指当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总 SUM(SAL) OVER(PARTITIONBY DEPTNO ORDERBY ENAME ROWSBETWEEN1 PRECEDING AND2 FOLLOWING) max_sal FROM SCOTT.EMP;