摘要:在本教程中,您将学习如何使用 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)
这是输出:
从输出中可以看到,第一组有三行,而其他组有两行。
让我们将组数从 4 更改为 3,如以下查询所示:
SELECT
val,
NTILE (3) OVER (
ORDER BY val
) bucket_no
FROM
t;
Code language: SQL (Structured Query Language) (sql)
结果集现在具有行数相同的三组。
MySQL NTILE()
函数示例
我们将使用示例数据库中的orders
、 orderDetails
和products
表进行演示。
请参阅以下查询:
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()
函数将行分配到指定数量的组中。
本教程有帮助吗?