MySQL DENSE_RANK函数

时间:2019-11-20 08:52:27  来源:igfitidea点击:

简介:在本教程中,您将学习MySQL DENSE_RANK()函数以及如何应用它来查找分区或结果集中的行列。

MySQL DENSE_RANK函数简介

DENSE_RANK()是一个窗口函数,可为分区或结果集中的每一行分配一个等级,而等级值之间没有任何间隔。

该行的排名从该行之前的不同排名值的数量增加了一个。

DENSE_RANK()函数的语法如下:

DENSE_RANK() OVER (
    PARTITION BY <expression>[{,<expression>...}]
    ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)

使用以下语法:

  • 首先,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;

以下语句使用DENSE_RANK()函数为每行分配一个等级:

SELECT
    val,
    DENSE_RANK() OVER (
        ORDER BY val
    ) my_rank
FROM
    t;

这是输出:

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;

输出如下:

在此示例中:

  • 首先,PARTITION BY子句使用会计年度将结果集划分为多个分区。

  • 其次,ORDER BY子句按降序指定销售员工的订单。

  • 第三,以ORDER BY子句指定的行顺序将DENSE_RANK()函数应用于每个分区。

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