MySQL DENSE_RANK Function

摘要:在本教程中,您将了解 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 Function Example

MySQL DENSE_RANK()函数示例

我们将使用窗口函数教程中创建的sales表进行演示。

sales table

以下语句使用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)

输出如下:

MySQL DENSE_RANK - Assign Rank to sales employees

在这个例子中:

  • 首先, PARTITION BY子句使用会计年度将结果集划分为多个分区。
  • 其次, ORDER BY子句指定销售人员按销售额降序排列。
  • 第三, DENSE_RANK()函数按照ORDER BY子句指定的行顺序应用于每个分区。

在本教程中,您学习了如何使用 MySQL DENSE_RANK()函数对结果集的每个分区中的行进行排名。

本教程有帮助吗?