RANK
在 MySQL 8.0 及更高版本中是关键字,它是一个窗口函数,用于计算行在一组结果集中的排名。
RANK()
函数的语法:
1 | RANK() OVER ( |
解释:
RANK()
: 这是窗口函数本身。OVER()
: 指定窗口函数的操作方式。PARTITION BY column1, column2, ...
: (可选) 将结果集分成多个分区。RANK()
函数将在每个分区内独立计算排名。 如果没有指定PARTITION BY
子句,则整个结果集被视为一个分区。ORDER BY column3 [ASC | DESC], column4 [ASC | DESC], ...
: 指定每个分区内数据的排序方式。RANK()
函数基于此排序来计算排名。ASC
表示升序(默认),DESC
表示降序。
RANK()
函数的工作原理:
RANK()
函数会为每个分区(或整个结果集,如果没有 PARTITION BY
子句)中的每一行分配一个排名。 排名是基于 ORDER BY
子句指定的排序顺序计算的。 如果有多行具有相同的排序值,它们将获得相同的排名,并且下一个排名将会跳过相同的数量。
示例:
假设我们有一个名为 employees
的表,包含以下数据:
employee_id | employee_name | department | salary |
---|---|---|---|
1 | Alice | Sales | 60000 |
2 | Bob | Sales | 70000 |
3 | Charlie | Marketing | 55000 |
4 | David | Marketing | 55000 |
5 | Eve | Sales | 70000 |
6 | Frank | Marketing | 80000 |
1. 计算所有员工的薪水排名:
1 | SELECT |
结果:
employee_id | employee_name | salary | salary_rank |
---|---|---|---|
6 | Frank | 80000 | 1 |
2 | Bob | 70000 | 2 |
5 | Eve | 70000 | 2 |
1 | Alice | 60000 | 4 |
3 | Charlie | 55000 | 5 |
4 | David | 55000 | 5 |
注意:Bob 和 Eve 具有相同的薪水,因此它们都获得了排名 2。下一个排名是 4,跳过了 3。 Charlie和David工资相同,排名也相同,下一个排名是6.
2. 计算每个部门内员工的薪水排名:
1 | SELECT |
结果:
employee_id | employee_name | department | salary | department_salary_rank |
---|---|---|---|---|
6 | Frank | Marketing | 80000 | 1 |
3 | Charlie | Marketing | 55000 | 2 |
4 | David | Marketing | 55000 | 2 |
2 | Bob | Sales | 70000 | 1 |
5 | Eve | Sales | 70000 | 1 |
1 | Alice | Sales | 60000 | 3 |
注意: PARTITION BY department
子句将员工分成 Sales 和 Marketing 两个分区。 RANK()
函数分别在每个分区内计算薪水排名。 Bob 和 Eve 在 Sales 部门内具有相同的薪水,因此都获得了排名 1。 Charlie和David在Marketing部门内工资相同,因此都获得排名2.
RANK()
, DENSE_RANK()
, ROW_NUMBER()
的区别:
RANK()
: 如果有多行具有相同的排序值,它们将获得相同的排名,并且下一个排名将会跳过相同的数量。 例如:1, 2, 2, 4, 5, 5, 5, 8…DENSE_RANK()
: 如果有多行具有相同的排序值,它们将获得相同的排名,但下一个排名不会跳过。 例如:1, 2, 2, 3, 4, 4, 4, 5…ROW_NUMBER()
: 为结果集中的每一行分配一个唯一的序列号,从 1 开始。 即使多行具有相同的排序值,它们也会获得不同的排名。 例如: 1, 2, 3, 4, 5, 6, 7, 8…
何时使用 RANK()
:
当你想知道某个值在一组值中的相对位置,并且需要处理具有相同值的行时,可以使用 RANK()
。 常见用例包括:
- 确定前 N 名学生、产品或员工。
- 比较不同类别中的值。
- 创建排行榜。
总结:
RANK()
是一个强大的窗口函数,可用于计算 MySQL 结果集中行的排名。 通过 PARTITION BY
和 ORDER BY
子句,你可以灵活地定义如何计算排名。 了解 RANK()
, DENSE_RANK()
和 ROW_NUMBER()
之间的区别,可以帮助你选择最适合特定需求的函数。
Related Issues not found
Please contact @yiGmMk to initialize the comment