总结:在本教程中,你将了解如何使用 SQL NTILE()
函数将结果集合分割为指定数量的存储桶。
SQL NTILE() 函数概述
SQL NTILE()
是一个 窗口函数,可让你将结果集合分割为指定数量的大致相等的分组或存储桶。它为每个分组分配一个从 1 开始的存储桶号。对于一个分组中的每一行,NTILE()
函数分配一个代表该行所属分组的存储桶号。
NTILE()
函数的语法如下所示
NTILE(buckets) OVER (
PARTITION BY expr1, expr2,...
ORDER BY expr1 [ASC|DESC], expr2 ...
)
Code language: SQL (Structured Query Language) (sql)
让我们详细讲解一下语法
buckets
存储桶的数量,可以是一个正整数文本或求值为一个正整数的表达式。
PARTITION BY
PARITITION BY
子句将 FROM
子句返回的结果集合分割为对之应用 NTILE()
函数的分区。
ORDER BY
ORDER BY
子句指定对之应用 NTILE()
的每个分区中行的顺序。
请注意,如果行数不能被 buckets
整除,NTILE()
函数将产生两组大小相差为 1 的分组。在由 ORDER BY
子句指定顺序中,较大分组始终在较小分组之前。
如果总行数可以被 buckets
整除,则行将在各分组中平均分配。
以下语句创建一个名为 t
的新表,其中存储从 1 到 10 的 10 个整数
CREATE TABLE t (
col INT NOT NULL
);
INSERT INTO t(col)
VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
SELECT * FROM t;
Code language: SQL (Structured Query Language) (sql)
如果使用 NTILE()
函数将 10 行分割为三组,你将得到一个包含四行的第一组和两个包含三行的其他分组。
SELECT
col,
NTILE (3) OVER (
ORDER BY col
) buckets
FROM
t;
Code language: SQL (Structured Query Language) (sql)
以下显示输出

如从输出中清楚显示的,第一组有四行,而其他分组各有三行。
以下语句使用的是两个存储桶,而不是三个存储桶
SELECT
col,
NTILE (2) OVER (
ORDER BY col
) buckets
FROM
t;
Code language: SQL (Structured Query Language) (sql)

现在,我们有两个具有相同数量的行分组。
SQL NTILE() 函数示例
查看示例数据库中的以下 employees
表
针对结果集的 SQL NTILE() 函数示例
以下语句使用 NTILE()
函数,根据员工的薪资将员工分为五个存储桶
SELECT
first_name,
last_name,
salary,
NTILE(5) OVER (
ORDER BY salary DESC
) salary_group
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
以下是输出

针对分区的 SQL NTILE() 函数示例
以下语句将每个部门的员工分为两组
SELECT
first_name,
last_name,
department_name,
salary,
NTILE(2) OVER (
PARTITION BY department_name
ORDER BY salary
) salary_group
FROM
employees e
INNER JOIN departments d
ON d.department_id = e.department_id;
Code language: SQL (Structured Query Language) (sql)
以下显示输出

在本例中
- 首先,
PARTITION BY
子句将员工按部门名称划分为分区。 - 然后,
ORDER BY
子句按薪资对每个分区中的员工进行排序。 - 最后,
NTILE()
函数为每个分区中的每一行分配一个存储桶号。每当部门发生变化时,它将重置该存储桶号。
在本教程中,你了解了如何使用 SQL NTILE()
函数将结果集合分割为指定数量的存储桶。