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:伪列,仅用于限制返回行数,无法指定排序规则。 ‌

相关推荐
科技小花5 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56616 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
FQNmxDG4S6 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全7 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717217 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
axng pmje7 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv78 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫8 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287928 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本8 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka