注释:为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的
oracel的高级用法:rank()/dense_rank() over(partition by ...order by ...)
现在客户有这样一个需求,查询每个部门工资最高的雇员的信息
方法一:常用方法
1 2 3 4 5 | 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 ...)
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(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 ...)
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(partition by e.deptno order by e.sal desc) rank from scott.emp e) e where e.rank = 1; |
三个方法结果一致。
over: 在什么条件之上。
partition by e.deptno: 按部门编号划分(分区)。
order by e.sal desc: 按工资从高到低排序(使用rank()/dense_rank() 时,必须要带order by否则非法)
rank()/dense_rank(): 分级
整个语句的意思就是:在按部门划分的基础上,按工资从高到低对雇员进行分级,“级别”由从小到大的数字表示(最小值一定为1)。
那么rank()和dense_rank()有什么区别呢?
rank(): 跳跃排序,如果有两个第一级时,接下来就是第三级。
dense_rank(): 连续排序,如果有两个第一级时,接下来仍然是第二级。
rank()的结果:
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
dense_rank()的结果:
ENAME JOB SAL DEPTNO RANK
SCOTT ANALYST 3000.00 20 1
FORD ANALYST 3000.00 20 1
JONES MANAGER 2975.00 20 2
ADAMS CLERK 1100.00 20 3
rank()第三列序号是3,dense_rank()第三列序号是2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现