PostgreSQL 教程: ntile 函数

八月 28, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的NTILE()函数,将分区中的有序行划分为指定数量的排名桶。

PostgreSQL NTILE() 函数介绍

PostgreSQL 的NTILE()函数允许您将分区中的有序行划分为指定数量且大小尽可能相等的排名组。这些排名组称为桶。

NTILE()函数为每个组分配一个从 1 开始的桶编号。对于组中的每一行,NTILE()函数分配一个代表该行所属组的桶编号。

NTILE()函数的语法如下:

NTILE(buckets) OVER (
    [PARTITION BY partition_expression, ... ]
    [ORDER BY sort_expression [ASC | DESC], ...]
)

让我们详细查看一下语法:

buckets

buckets是代表排名组的数字。它可以是对每个分区计算结果为正整数值(大于 0)的数字或表达式。buckets不能为空。

PARTITION BY

PARTITION BY子句将行分配到应用该函数的分区中。

PARTITION BY子句是可选的。如果跳过它,该函数会将整个结果集视为单个分区。

ORDER BY

ORDER BY子句对应用该函数的每个分区中的行进行排序。

ORDER BY子句是可选的。但是,您应该始终使用ORDER BY子句来获得预期结果。

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

PostgreSQL NTILE() 函数示例

让我们看一些使用NTILE()函数的示例。

我们将使用CUME_DIST()函数教程中创建的sales_stats表来演示NTILE()函数。

SELECT 
	year,
	name,
	amount
FROM 
	actual_sales
ORDER BY 
	year, name;

sales_stats table

1) 在结果集上使用 NTILE() 函数的示例

此示例使用NTILE()函数将行分配到 3 个桶中:

SELECT 
	name,
	amount,
	NTILE(3) OVER(
		ORDER BY amount
	)
FROM
	sales_stats
WHERE
	year = 2019;

这是输出:

PostgreSQL NTILE Function Over a Result Set Example

2) 在分区上使用 NTILE() 函数的示例

此示例使用NTILE()函数将sales_stats表中的行分为 2 个分区,每个分区 3 个桶:

SELECT 
	name,
	amount,
	NTILE(3) OVER(
		PARTITION BY year
		ORDER BY amount
	)
FROM
	sales_stats;

这是结果集:

PostgreSQL NTILE Function Over a Partition Example

在本教程中,您学习了如何使用 PostgreSQL 的NTILE()函数,将分区内的有序行分配到指定数量的排名组中。