用一条sql求出每个部门(emp表)的最大工资和最小工资,
以及最大工资和最小工资的员工姓名。(注:一次表扫描。同一个部门最大工资或最小工资的人可能不止一个)。
(1)如果没有后边的扫描表一次就会有很多的方法可以写出需求
select empno, ename, sal max_sal, null min_sal
from (select empno,
ename,
sal,
dense_rank() over(partition by deptno order by sal desc) rn
from emp)
where rn = 1
union all
select empno, ename, null, sal
from (select empno,
ename,
sal,
dense_rank() over(partition by deptno order by sal asc) rn
from emp)
where rn = 1;
(2)wmsys.wm_concat函数
select deptno 部门编号,
min(sal) 最小工资,
wmsys.wm_concat(ename) keep(dense_rank first order by sal)最小工资的员工,
max(sal) 最大工资,
wmsys.wm_concat(ename) keep(dense_rank last order by sal)最大工资的员工
from emp
group by deptno;
部门编号 最小工资 最小工资的员工 最大工资 最大工资的员工
--------- ---------- ------------------------------------------------- ---------------------- -------------------
10 1300 MILLER 5000 KING
20 800 SMITH 3000 SCOTT,FORD
30 950 JAMES 2850 BLAKE
执行计划
----------------------------------------------------------
Plan hash value: 15469362
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 462 | 4 (25)| 00:00:01 |
| 1 | SORT GROUP BY | | 14 | 462 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 462 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
429 recursive calls
72 db block gets
711 consistent gets
42 physical reads
0 redo size
5002 bytes sent via SQL*Net to client
4303 bytes received via SQL*Net from client
23 SQL*Net roundtrips to/from client
30 sorts (memory)
0 sorts (disk)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31402276/viewspace-2126901/
,如需转载,请注明出处,否则将追究法律责任。