SQL NTILE

总结:在本教程中,你将了解如何使用 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)

以下显示输出

SQL NTILE Function - buckets with different sizes

如从输出中清楚显示的,第一组有四行,而其他分组各有三行。

以下语句使用的是两个存储桶,而不是三个存储桶

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 function over result set example

针对分区的 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)

以下显示输出

SQL NTILE function over partition example

在本例中

  • 首先,PARTITION BY 子句将员工按部门名称划分为分区。
  • 然后,ORDER BY 子句按薪资对每个分区中的员工进行排序。
  • 最后,NTILE() 函数为每个分区中的每一行分配一个存储桶号。每当部门发生变化时,它将重置该存储桶号。

在本教程中,你了解了如何使用 SQL NTILE() 函数将结果集合分割为指定数量的存储桶。

本教程是否有用?