SQL row_number()函数

在SQL中,ROW_NUMBER()函数是一种用于给查询结果集中的行添加行号的函数。它可以根据指定的列或排序规则对结果集进行排序,并为每一行分配一个唯一的行号。
语法
ROW_NUMBER() OVER (ORDER BY column_name)
ROW_NUMBER(): 表示要使用的函数,用于给每一行分配一个行号。OVER: 用于指定要对哪些行进行排序并分配行号。ORDER BY column_name: 按照指定的列进行排序,可以是一个或多个列。
示例
假设我们有一个名为employees的表,包含员工的姓名和薪水信息。我们想要对员工按照薪水从高到低进行排序,并为每个员工分配一个行号。
employees表
| employee_id | name | salary |
|---|---|---|
| 1 | Alice | 5000 |
| 2 | Bob | 6000 |
| 3 | Charlie | 4500 |
| 4 | David | 7000 |
| 5 | Emma | 5500 |
SQL查询
SELECT
name,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_number
FROM employees;
运行结果
| name | salary | row_number |
|---|---|---|
| David | 7000 | 1 |
| Bob | 6000 | 2 |
| Emma | 5500 | 3 |
| Alice | 5000 | 4 |
| Charlie | 4500 | 5 |
在上面的示例中,我们使用ROW_NUMBER() OVER (ORDER BY salary DESC)对employees表按照薪水从高到底进行排序,并为每个员工分配了一个行号。最终的结果集中,每一行都有一个row_number列,表示该行在排序后的顺序。
使用PARTITION BY
除了简单地对整个结果集进行排序外,ROW_NUMBER()函数还支持使用PARTITION BY对结果进行分区。这样可以在每个分区内独立地分配行号。
示例
假设我们想要按照部门对员工进行分组,并且在每个部门内按照薪水排序并分配行号。
employees表
| employee_id | name | department | salary |
|---|---|---|---|
| 1 | Alice | HR | 5000 |
| 2 | Bob | HR | 6000 |
| 3 | Charlie | Sales | 4500 |
| 4 | David | Sales | 7000 |
| 5 | Emma | Sales | 5500 |
SQL查询
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_number
FROM employees;
运行结果
| name | department | salary | row_number |
|---|---|---|---|
| Bob | HR | 6000 | 1 |
| Alice | HR | 5000 | 2 |
| David | Sales | 7000 | 1 |
| Emma | Sales | 5500 | 2 |
| Charlie | Sales | 4500 | 3 |
在上面的示例中,我们对employees表按照department列进行分区,并在每个部门内按照薪水进行排序并分配行号。结果中可以看到,在每个部门内员工的行号是独立的,即每个部门内的第一个员工行号都是1。
通过ROW_NUMBER()函数,我们可以方便地对SQL查询结果中的行进行排序并分配行号。这在一些需要对结果做进一步分析或报告生成的场景中非常有用。
极客笔记