摘要:在本教程中,您将学习如何使用 ROW_NUMBER() 为查询结果集中的每一行分配一个连续的序号。
SQL ROW_NUMBER() 函数简介 #ROW_NUMBER() 是一个窗口函数,它为结果集中的每一行分配一个连续的整数序号。
以下是 ROW_NUMBER() 函数的语法:
ROW_NUMBER() OVER (
[PARTITION BY expr1, expr2,...]
ORDER BY expr1 [ASC | DESC], expr2,...
)Code language: SQL (Structured Query Language) (sql)在此语法中,
PARTITION BY 子句将结果集划分为分区。PARTITION BY 子句是可选的。如果省略它,ROW_NUMBER 函数会将整个结果集视为单个分区。ORDER BY 子句对每个分区中的行进行排序。由于 ROW_NUMBER() 是一个对顺序敏感的函数,因此 ORDER BY 子句是强制性的。ROW_NUMBER() 函数为每个分区内的每一行分配一个连续的整数序号。当跨越分区边界时,它会重置行号。SQL ROW_NUMBER() 函数示例 #我们将使用示例数据库中的 employees 和 departments 表进行演示。
基本的 ROW_NUMBER() 函数示例 #以下语句检索所有员工的名字、姓氏和薪水,并使用 ROW_NUMBER() 函数为每一行添加连续的整数序号。
SELECT
ROW_NUMBER() OVER (
ORDER BY
salary
) row_num,
first_name,
last_name,
salary
FROM
employees;Code language: SQL (Structured Query Language) (sql)试一试
下图显示了部分结果集:
使用 SQL ROW_NUMBER() 函数进行分页 #ROW_NUMBER() 函数对于分页非常有用。
例如,如果您想在应用程序的表格中按页显示所有员工,每页有十条记录。
首先,使用 ROW_NUMBER() 函数为每一行分配一个连续的整数序号。其次,按请求的页面筛选行。第一页包括从 1 到 10 的行,第二页包括从 11 到 20 的行,依此类推。以下语句返回第二页的行:
SELECT
*
FROM
(
SELECT
ROW_NUMBER() OVER (
ORDER BY
salary
) row_num,
first_name,
last_name,
salary
FROM
employees
) t
WHERE
row_num > 10
AND row_num <= 20;Code language: SQL (Structured Query Language) (sql)试一试
下图显示了输出结果:
您可以使用公用表表达式 (CTE) 来代替子查询。
WITH
t AS (
SELECT
ROW_NUMBER() OVER (
ORDER BY
salary
) row_num,
first_name,
last_name,
salary
FROM
employees
)
SELECT
*
FROM
t
WHERE
row_num > 10
AND row_num <= 20;Code language: SQL (Structured Query Language) (sql)查找每个分组中的第 n 高值 #以下示例向您展示如何找出在各自部门中薪水最高的员工。
SELECT
department_name,
first_name,
last_name,
salary
FROM
(
SELECT
department_name,
ROW_NUMBER() OVER (
PARTITION BY department_name
ORDER BY salary DESC) row_num,
first_name,
last_name,
salary
FROM
employees e
INNER JOIN departments d
ON d.department_id = e.department_id
) t
WHERE
row_num = 1;Code language: SQL (Structured Query Language) (sql)试一试
在子查询中:
首先,PARTITION BY 子句按部门对员工进行分组。其次,ORDER BY 子句按薪水降序对每个部门的员工进行排序。第三,ROW_NUMBER() 为每一行分配一个连续的整数序号。当部门变更时,序号会重置。以下显示了子查询的结果集:
在外层查询中,我们只选择 row_num 值为 1 的员工行。
这是整个查询的输出结果:
如果您将 WHERE 子句中的谓词从 1 更改为 2、3 等,您将得到薪水第二高、第三高的员工,依此类推。
摘要 #使用 SQL ROW_NUMBER() 函数为同一分区内的每一行分配一个连续的整数序号。数据库 #PostgreSQL ROW_NUMBER 函数Oracle ROW_NUMBER 函数SQL Server ROW_NUMBER 函数MySQL ROW_NUMBER 函数SQLite ROW_NUMBER 函数本教程是否有帮助? 是 否 发送 取消