MySQL NTILE Function

摘要:在本教程中,您将学习如何使用 MySQL NTILE()函数将行划分为指定数量的组。

MySQL NTILE()函数简介

MySQL NTILE()函数将排序分区中的行划分为特定数量的组。每个组都分配有一个从 1 开始的桶号。对于每一行, NTILE()函数返回一个代表该行所属组的存储桶编号。

下面显示了NTILE()函数的语法:

NTILE(n) OVER (
    PARTITION BY <expression>[{,<expression>...}]
    ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)Code language: SQL (Structured Query Language) (sql)

在这个语法中:

  • n是字面正整数。桶号的范围是 1 到n
  • PARTITION BY将从FROM子句返回的结果集划分为应用NTILE()函数的分区。
  • ORDER BY子句指定将NTILE()值分配给分区中的行的顺序。

请注意,如果分区行数不能被n整除, NTILE()函数将生成两个大小相差一的组。较大的组始终按照ORDER BY子句指定的顺序出现在较小的组之前。

另一方面,如果分区行的总数可被n整除,则行将在组之间平均分配。

请参见下表,该表存储了从一到九的九个整数:

CREATE TABLE t (
    val INT NOT NULL
);

INSERT INTO t(val) 
VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9);


SELECT * FROM t;Code language: SQL (Structured Query Language) (sql)

如果使用NTILE()函数将九行分为四组,则最终将得到第一组三行和其他三组四行。

请看下面的演示:

SELECT 
    val, 
    NTILE (4) OVER (
        ORDER BY val
    ) bucket_no
FROM 
    t;
Code language: SQL (Structured Query Language) (sql)

这是输出:

MySQL NTILE function - groups with the different number of rows

从输出中可以看到,第一组有三行,而其他组有两行。

让我们将组数从 4 更改为 3,如以下查询所示:

SELECT 
    val, 
    NTILE (3) OVER (
        ORDER BY val
    ) bucket_no
FROM 
    t;
Code language: SQL (Structured Query Language) (sql)

结果集现在具有行数相同的三组。

MySQL NTILE function - groups with difference in rows

MySQL NTILE()函数示例

我们将使用示例数据库中的ordersorderDetailsproducts表进行演示。

请参阅以下查询:

WITH productline_sales AS (
    SELECT productline,
           year(orderDate) order_year,
           ROUND(SUM(quantityOrdered * priceEach),0) order_value
    FROM orders
    INNER JOIN orderdetails USING (orderNumber)
    INNER JOIN products USING (productCode)
    GROUP BY productline, order_year
)
SELECT
    productline, 
    order_year, 
    order_value,
    NTILE(3) OVER (
        PARTITION BY order_year
        ORDER BY order_value DESC
    ) product_line_group
FROM 
    productline_sales;
Code language: SQL (Structured Query Language) (sql)

在这个例子中:

  • 首先,在productline_sales公共表表达式中,我们按年份获取每个产品线的总订单值。
  • 然后,我们使用NTILE()函数将每年按产品线的销售额分为三组。

这是输出:

MySQL NTILE function with CTE example

在本教程中,您学习了如何使用 MySQL NTILE()函数将行分配到指定数量的组中。

本教程有帮助吗?