2024年06月25日 SQL row number 函数 极客笔记
在SQL中,ROW_NUMBER()
函数是一种用于给查询结果集中的行添加行号的函数。它可以根据指定的列或排序规则对结果集进行排序,并为每一行分配一个唯一的行号。
ROW_NUMBER() OVER (ORDER BY column_name)
ROW_NUMBER()
: 表示要使用的函数,用于给每一行分配一个行号。OVER
: 用于指定要对哪些行进行排序并分配行号。ORDER BY column_name
: 按照指定的列进行排序,可以是一个或多个列。假设我们有一个名为employees
的表,包含员工的姓名和薪水信息。我们想要对员工按照薪水从高到低进行排序,并为每个员工分配一个行号。
employee_id | name | salary |
---|---|---|
1 | Alice | 5000 |
2 | Bob | 6000 |
3 | Charlie | 4500 |
4 | David | 7000 |
5 | Emma | 5500 |
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
列,表示该行在排序后的顺序。
除了简单地对整个结果集进行排序外,ROW_NUMBER()
函数还支持使用PARTITION BY
对结果进行分区。这样可以在每个分区内独立地分配行号。
假设我们想要按照部门对员工进行分组,并且在每个部门内按照薪水排序并分配行号。
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 |
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查询结果中的行进行排序并分配行号。这在一些需要对结果做进一步分析或报告生成的场景中非常有用。
本文链接:http://so.lmcjl.com/news/7238/