SQL Server ROW_NUMBER() 函数使用指南
ROW_NUMBER()
是一种窗口函数,用于为结果集中的每一行分配一个唯一的行号。它通常用于排序结果集,并返回结果集中每一行的排名。
语法
ROW_NUMBER() OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC|DESC], ...
)
- PARTITION BY:可选项,按指定列的值将结果集划分为多个分区。
- ORDER BY:必选项,指定排序列及排序方式。
使用场景
ROW_NUMBER()
函数通常用于以下场景:
- 对结果集进行排序,并按行号进行标记
- 分页查询中,返回指定页的数据
- 在查询结果中根据行号进行筛选或过滤
示例
示例 1
假设有一个学生表 students
,包含 id
、name
、score
三列,需要返回按照分数降序排列的学生信息,并为每个学生分配一个行号。可以使用如下 SQL 语句:
SELECT ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num, id, name, score
FROM students
执行以上 SQL 语句后,会得到以下结果:
row_num | id | name | score |
---|---|---|---|
1 | 3 | Mike | 90 |
2 | 2 | Tom | 80 |
3 | 5 | Jack | 75 |
4 | 4 | Lily | 70 |
5 | 1 | John | 65 |
示例 2
假设有一个订单表 orders
,包含 order_id
、order_date
、customer_id
、amount
四列,需要返回 2019 年 1 月份每个客户的最早订单信息,并为每个订单分配一个行号。可以使用如下 SQL 语句:
SELECT ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS row_num,
order_id,
order_date,
customer_id,
amount
FROM orders
WHERE YEAR(order_date) = 2019
AND MONTH(order_date) = 1;
执行以上 SQL 语句后,会得到以下结果:
row_num | order_id | order_date | customer_id | amount |
---|---|---|---|---|
1 | 1001 | 2019-01-01 | A001 | 1000.00 |
2 | 1005 | 2019-01-05 | A001 | 2000.00 |
1 | 1002 | 2019-01-02 | A002 | 1500.00 |
结论
通过 ROW_NUMBER()
函数,我们可以为查询结果中的每一行分配一个唯一的行号,便于对结果进行分析、筛选、排序等操作。同时, ROW_NUMBER()
函数也可用于分页查询,将结果集分为多个分区后,只返回指定分区的数据。