2026-10-22 15:06:31
ROWNUMBER() 是 SQL 中用于为结果集中的行分配唯一序号的窗口函数,其核心用法和注意事项如下:
核心语法ROWNUMBER() OVER ( [PARTITION BY partition_expression] ORDER BY sort_expression [ASC|DESC])基础行号分配为所有行按 id 排序生成连续行号:
SELECT ROWNUMBER() OVER (ORDER BY id) AS RowNum, * FROM table_name;分区内行号按 department_id 分组,每组内按 salary 降序分配行号:
SELECT ROWNUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS RowNum, employee_name, salaryFROM employee_table;筛选后分配行号先筛选部门 ID 为 10 的员工,再按薪资排序分配行号:
SELECT ROWNUMBER() OVER (ORDER BY salary) AS RowNum, *FROM employee_tableWHERE department_id = 10;指定起始值(部分数据库支持)某些数据库(如 SQL Server)允许通过参数设置起始值(默认为 1):
-- SQL Server 语法SELECT ROWNUMBER() OVER (ORDER BY id) + 9 AS RowNumFrom10, *FROM table_name;非计算用途ROWNUMBER() 不能用于聚合函数(如 SUM()、AVG())或计算列中。
仅限 SELECT该函数仅适用于 SELECT 语句,不可用于 UPDATE 或 DELETE。
非确定性结果若 ORDER BY 列存在重复值,行号分配可能不稳定(每次查询结果顺序可能不同)。
数据库兼容性
标准 SQL:支持基本语法。
Oracle/PostgreSQL:直接使用 ROWNUMBER() OVER()。
SQL Server:语法相同,但起始值需通过计算调整(如 ROWNUMBER() + N)。
MySQL 8.0+:支持窗口函数,早期版本需用变量模拟。
问题:需要跳过前 N 行(类似 LIMIT offset)。解决:结合子查询或 WHERE 过滤:
SELECT * FROM ( SELECT ROWNUMBER() OVER (ORDER BY id) AS RowNum, * FROM table_name) tWHERE RowNum > 5;问题:分组后取每组前 N 条记录。解决:使用 PARTITION BY + 行号过滤:
SELECT * FROM ( SELECT ROWNUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS RowNum, * FROM employee_table) tWHERE RowNum <= 3; -- 取每部门薪资最高的3人ROWNUMBER() 是数据分析中实现分页、排名或分组内排序的核心工具,但需注意其语法细节和数据库差异。合理利用 PARTITION BY 和 ORDER BY 可以灵活控制行号分配逻辑。