摘要:在本教程中,您将了解 MySQL DENSE_RANK()
函数以及如何应用它来查找分区或结果集中的行排名。
MySQL DENSE_RANK
函数简介
DENSE_RANK()
是一个窗口函数,它为分区或结果集中的每一行分配排名,排名值之间没有间隙。
行的排名根据该行之前的不同排名值的数量增加 1。
DENSE_RANK()
函数的语法如下:
DENSE_RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)
Code language: SQL (Structured Query Language) (sql)
在这个语法中:
- 首先,
PARTITION BY
子句将FROM
子句生成的结果集划分为多个分区。DENSE_RANK()
函数应用于每个分区。 - 其次,
ORDER BY
子句指定DENSE_RANK()
函数操作的每个分区中的行顺序。
如果一个分区有两行或更多行具有相同的排名值,则这些行中的每一行都将被分配相同的排名。
与RANK()
函数不同, DENSE_RANK()
函数始终返回连续的排名值。
假设我们有一个表t
其中包含一些样本数据,如下所示:
CREATE TABLE t (
val INT
);
INSERT INTO t(val)
VALUES(1),(2),(2),(3),(4),(4),(5);
SELECT
*
FROM
t;
Code language: SQL (Structured Query Language) (sql)
以下语句使用DENSE_RANK()
函数为每行分配排名:
SELECT
val,
DENSE_RANK() OVER (
ORDER BY val
) my_rank
FROM
t;
Code language: SQL (Structured Query Language) (sql)
这是输出:
MySQL DENSE_RANK()
函数示例
我们将使用窗口函数教程中创建的sales
表进行演示。
以下语句使用DENSE_RANK()
函数按销售额对销售员工进行排名。
SELECT
sales_employee,
fiscal_year,
sale,
DENSE_RANK() OVER (PARTITION BY
fiscal_year
ORDER BY
sale DESC
) sales_rank
FROM
sales;
Code language: SQL (Structured Query Language) (sql)
输出如下:
在这个例子中:
- 首先,
PARTITION BY
子句使用会计年度将结果集划分为多个分区。 - 其次,
ORDER BY
子句指定销售人员按销售额降序排列。 - 第三,
DENSE_RANK()
函数按照ORDER BY
子句指定的行顺序应用于每个分区。
在本教程中,您学习了如何使用 MySQL DENSE_RANK()
函数对结果集的每个分区中的行进行排名。
本教程有帮助吗?