DENSE_RANK()

函数说明

DENSE_RANK() 为数据集中的每一行提供一个唯一的排名,与 RANK() 函数非常相似。DENSE_RANK() 函数首先根据 ORDER BY 子句中指定的列对数据集进行排序,然后为每一行赋予一个唯一的排名。

DENSE_RANK() 函数处理平局(即两行或更多行具有相同的值)的方式与 RANK() 函数略有不同。在存在平局的情况下,DENSE_RANK() 会为具有相同值的所有行赋予相同的排名,但是不会跳过紧随其后的任何排名。例如,如果两行获得排名 1,那么下一行将获得排名 2,而不是 3。

函数语法

  1. > DENSE_RANK() OVER (
  2. [PARTITION BY column_1, column_2, ... ]
  3. ORDER BY column_3, column_4, ...
  4. )
  • PARTITION BY 子句是可选的,它将数据集分为多个分区,在每个分区内部单独计算排名。
  • ORDER BY 子句定义了数据集的排序方式,即根据哪一列或哪些列进行排序。可以指定升序(ASC)或降序(DESC)排序。

示例

  1. -- 创建一个名为'SalesTable'的表,它有三个字段:'Department''Employee''Sales'
  2. CREATE TABLE SalesTable (
  3. Department VARCHAR(50),
  4. Employee VARCHAR(50),
  5. Sales INT
  6. );
  7. -- 'SalesTable'表插入数据,每一行都包含一个部门('Department')、一个员工姓名('Employee')和他们的销售额('Sales'
  8. INSERT INTO SalesTable (Department, Employee, Sales) VALUES
  9. ('Marketing', 'John', 1000),
  10. ('Marketing', 'Jane', 1200),
  11. ('Sales', 'Alex', 900),
  12. ('Sales', 'Bob', 1100),
  13. ('HR', 'Alice', 800),
  14. ('HR', 'Charlie', 850);
  15. -- 查询'SalesTable'表,返回员工的名字,他们的销售额,以及他们的销售排名(使用'DENSE_RANK()'函数)
  16. -- 在这个查询中,'DENSE_RANK()'函数根据销售额的降序(由'ORDER BY Sales DESC'指定)对所有员工进行排名
  17. -- 如果多个员工的销售额相同,他们会得到相同的排名,并且下一个销售额的排名不会跳过。所以,如果有两个员工的销售额都是第一,那么下一个员工的排名就是第二,而不是第三。
  18. mysql> SELECT
  19. Employee,
  20. Sales,
  21. DENSE_RANK() OVER(ORDER BY Sales DESC) FROM
  22. SalesTable;
  23. +----------+-------+-----------------------------------------+
  24. | employee | sales | dense_rank() over (order by sales desc) |
  25. +----------+-------+-----------------------------------------+
  26. | Jane | 1200 | 1 |
  27. | Bob | 1100 | 2 |
  28. | John | 1000 | 3 |
  29. | Alex | 900 | 4 |
  30. | Charlie | 850 | 5 |
  31. | Alice | 800 | 6 |
  32. +----------+-------+-----------------------------------------+
  33. 6 rows in set (0.01 sec)