2024年4月19日发(作者:)

row_number() over怎么使用

ROW_NUMBER() OVER() 是 SQL 中的一个窗口函数,用于为

结果集中的每一行分配一个唯一的序号。这个序号是基于 OVER() 子

句中定义的排序规则来生成的。

下面是 ROW_NUMBER() OVER() 的基本语法:

sql复制代码

SELECT

column1, column2, ...,

ROW_NUMBER() OVER (

[PARTITION BY partition_expression, ... ]

ORDER BY sort_expression [ASC | DESC], ...

) AS row_number

FROM table_name;

PARTITION BY 是可选的,用于将结果集划分为多个分区,并

为每个分区的每一行分配一个序号。如果没有指定 PARTITION BY,

则整个结果集被视为一个单一的分区。

ORDER BY 是必需的,用于定义每个分区中行的排序方式。

示例

假设我们有一个名为 employees 的表,其中包含以下数据:

id

1

name

Alice

department

HR

id

2

3

4

5

name

Bob

Charlie

David

Eva

department

Engineering

HR

Engineering

HR

如果我们想为每个部门的员工分配一个序号,可以使用以下查询:

sql复制代码

SELECT

id, name, department,

ROW_NUMBER() OVER (

PARTITION BY department

ORDER BY name ASC

) AS row_number

FROM employees;

结果将是:

id

1

name

Alice

department

HR

row_number

1

id

3

5

2

4

name

Charlie

Eva

Bob

David

department

HR

HR

Engineering

Engineering

row_number

2

3

1

2

在这个例子中,我们使用了 PARTITION BY department,所以

每个部门的员工都被分配了独立的序号。序号是按照员工的名字(升

序)来分配的。

注意

ROW_NUMBER() 生成的序号是唯一的,并且不会因为数据的

更改而发生变化(除非数据被删除或插入)。

如果需要处理数据的变化,并且希望序号保持连续,可能需要

考虑使用其他窗口函数,如 DENSE_RANK() 或 RANK()。