Oracle中ROW_NUMBER() OVER()

Oracle中ROW_NUMBER() OVER()是窗口函数,用于为查询结果集中的每一行分配唯一序号,支持分组排序和全局排序。

1、基本语法

ROW_NUMBER() OVER([PARTITION BY 分组列] ORDER BY 排序列 [ASC|DESC])

PARTITION BY:按指定列分组,未指定则对整个结果集排序。

ORDER BY:定义排序规则(升序或降序)。

2、典型应用场景

‌(1)分页查询‌

获取薪资排名第四到第六的员工:

SELECT * FROM (

SELECT employee_id, salary,

ROW_NUMBER() OVER(ORDER BY salary DESC) AS rn

FROM employees

) WHERE rn BETWEEN 4 AND 6;

‌(2)数据去重‌

获取每个部门薪资最高的员工:

SELECT * FROM (

SELECT department_id, employee_name, salary,

ROW_NUMBER() OVER(PARTITION BY department_id

ORDER BY salary DESC) AS rn

FROM employees

) WHERE rn = 1;

(3) ‌分组排名‌

统计每个部门员工薪资排名:

SELECT department_id, employee_name, salary,

ROW_NUMBER() OVER(PARTITION BY department_id

ORDER BY salary DESC) AS rank

FROM employees;

3、与ROWNUM的区别

ROW_NUMBER():支持分组排序,为每行分配唯一序号。

ROWNUM:伪列,仅用于限制返回行数,无法指定排序规则。 ‌

相关推荐
.柒宇.3 小时前
MySQL双主同步
linux·数据库·mysql·docker
Trouvaille ~3 小时前
【MySQL篇】数据类型:存储数据的基础
android·数据库·mysql·adb·字符集·数据类型·基础入门
一 乐3 小时前
酒店预订|基于springboot + vue酒店预订系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·酒店预订系统
Moe4883 小时前
Spring AI Advisors:从链式增强到递归顾问
java·后端
敖正炀3 小时前
ReentrantReadWriteLock、ReentrantLock、synchronized 对比
java
cike_y3 小时前
Java反序列化漏洞-Shiro721流程分析
java·反序列化·shiro框架
极创信息4 小时前
信创系统认证服务怎么做?从适配到验收全流程指南
java·大数据·运维·tomcat·健康医疗
光泽雨4 小时前
UNION 和 UNION ALL 作用
数据库·sql
格鸰爱童话4 小时前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
heimeiyingwang4 小时前
【架构实战】SQL调优实战:从执行计划到索引优化
数据库·sql·架构