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