注释:为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的
oracel的高级用法:rank()/dense_rank() over(partition by ...order by ...)
现在客户有这样一个需求,查询每个部门工资最高的雇员的信息
方法一:常用方法
select e.ename, e.job, e.sal, e.deptno from scott.emp e, (select e.deptno, max(e.sal) sal from scott.emp e group by e.deptno) me where e.deptno = me.deptno and e.sal = me.sal;
方法二:rank() over(partition by...order by ...)
select e.ename, e.job, e.sal, e.deptno from (select e.ename, e.job, e.sal, e.deptno, rank() over(partition by e.deptno order by e.sal desc) rank from scott.emp e) e where e.rank = 1;
方法三:dense_rank() over(partition by...order by ...)
select e.ename, e.job, e.sal, e.deptno from (select e.ename, e.job, e.sal, e.deptno, dense_rank() over(partition by e.deptno order by e.sal desc) rank from scott.emp e) e where e.rank = 1;
结果:
ENAME JOB SAL DEPTNO RANK
SCOTT ANALYST 3000.00 20 1
FORD ANALYST 3000.00 20 1
JONES MANAGER 2975.00 20 3
ADAMS CLERK 1100.00 20 4