编程笔记

lifelong learning & practice makes perfect

rank是mysql关键字吗,怎么用

RANK 在 MySQL 8.0 及更高版本中是关键字,它是一个窗口函数,用于计算行在一组结果集中的排名。

RANK() 函数的语法:

1
2
3
4
RANK() OVER (
[PARTITION BY column1, column2, ...]
ORDER BY column3 [ASC | DESC], column4 [ASC | DESC], ...
)

解释:

  • 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
2
3
4
5
6
7
SELECT
employee_id,
employee_name,
salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM
employees;

结果:

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
2
3
4
5
6
7
SELECT
employee_id,
employee_name,
department,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS department_salary_rank
FROM
employees;

结果:

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 BYORDER BY 子句,你可以灵活地定义如何计算排名。 了解 RANK(), DENSE_RANK()ROW_NUMBER() 之间的区别,可以帮助你选择最适合特定需求的函数。

欢迎关注我的其它发布渠道

Related Issues not found

Please contact @yiGmMk to initialize the comment