DENSE_RANK()
函数说明
DENSE_RANK()
为数据集中的每一行提供一个唯一的排名,与 RANK() 函数非常相似。DENSE_RANK()
函数首先根据 ORDER BY 子句中指定的列对数据集进行排序,然后为每一行赋予一个唯一的排名。
DENSE_RANK()
函数处理平局(即两行或更多行具有相同的值)的方式与 RANK()
函数略有不同。在存在平局的情况下,DENSE_RANK()
会为具有相同值的所有行赋予相同的排名,但是不会跳过紧随其后的任何排名。例如,如果两行获得排名 1,那么下一行将获得排名 2,而不是 3。
函数语法
> DENSE_RANK() OVER (
[PARTITION BY column_1, column_2, ... ]
ORDER BY column_3, column_4, ...
)
PARTITION BY
子句是可选的,它将数据集分为多个分区,在每个分区内部单独计算排名。ORDER BY
子句定义了数据集的排序方式,即根据哪一列或哪些列进行排序。可以指定升序(ASC)或降序(DESC)排序。
示例
-- 创建一个名为'SalesTable'的表,它有三个字段:'Department','Employee'和'Sales'
CREATE TABLE SalesTable (
Department VARCHAR(50),
Employee VARCHAR(50),
Sales INT
);
-- 向'SalesTable'表插入数据,每一行都包含一个部门('Department')、一个员工姓名('Employee')和他们的销售额('Sales')
INSERT INTO SalesTable (Department, Employee, Sales) VALUES
('Marketing', 'John', 1000),
('Marketing', 'Jane', 1200),
('Sales', 'Alex', 900),
('Sales', 'Bob', 1100),
('HR', 'Alice', 800),
('HR', 'Charlie', 850);
-- 查询'SalesTable'表,返回员工的名字,他们的销售额,以及他们的销售排名(使用'DENSE_RANK()'函数)
-- 在这个查询中,'DENSE_RANK()'函数根据销售额的降序(由'ORDER BY Sales DESC'指定)对所有员工进行排名
-- 如果多个员工的销售额相同,他们会得到相同的排名,并且下一个销售额的排名不会跳过。所以,如果有两个员工的销售额都是第一,那么下一个员工的排名就是第二,而不是第三。
mysql> SELECT
Employee,
Sales,
DENSE_RANK() OVER(ORDER BY Sales DESC) FROM
SalesTable;
+----------+-------+-----------------------------------------+
| employee | sales | dense_rank() over (order by sales desc) |
+----------+-------+-----------------------------------------+
| Jane | 1200 | 1 |
| Bob | 1100 | 2 |
| John | 1000 | 3 |
| Alex | 900 | 4 |
| Charlie | 850 | 5 |
| Alice | 800 | 6 |
+----------+-------+-----------------------------------------+
6 rows in set (0.01 sec)