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,包含 idnamescore 三列,需要返回按照分数降序排列的学生信息,并为每个学生分配一个行号。可以使用如下 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_idorder_datecustomer_idamount 四列,需要返回 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() 函数也可用于分页查询,将结果集分为多个分区后,只返回指定分区的数据。