PostgreSQL 教程: dense_rank 函数

八月 26, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的DENSE_RANK()函数,为结果集分区内的每一行分配排名,并且排名值之间没有间隙。

PostgreSQL DENSE_RANK() 函数介绍

DENSE_RANK()为结果集的每个分区中的每一行分配一个排名。与RANK()函数不同,DENSE_RANK()函数始终返回连续的排名值。

对于每个分区,DENSE_RANK()函数为具有相同值的行返回相同的排名。

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

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

DENSE_RANK()函数按照ORDER BY子句指定的排序顺序,应用于PARTITION BY子句定义的每个分区中的每一行。当跨越分区边界时,它将重置排名。

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

PostgreSQL DENSE_RANK() 函数演示

首先,创建一个表,名为dense_ranks,表中包含一列:

CREATE TABLE dense_ranks (
	c VARCHAR(10)
);

其次,插入一些行dense_ranks表中:

INSERT INTO dense_ranks(c)
VALUES('A'),('A'),('B'),('C'),('C'),('D'),('E');

第三步,从dense_ranks表中查询数据

SELECT c from dense_ranks;

img

第四步,使用DENSE_RANK()函数为结果集中的每一行分配排名:

SELECT
	c,
	DENSE_RANK() OVER (
		ORDER BY c
	) dense_rank_number
FROM
	dense_ranks;

这是输出:

PostgreSQL DENSE_RANK Function example

PostgreSQL DENSE_RANK() 函数示例

我们将使用products表来演示DENSE_RANK()函数。

img

img

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

此语句使用DENSE_RANK()函数按标价对产品进行排名:

SELECT
	product_id,
	product_name,
	price,
	DENSE_RANK () OVER ( 
		ORDER BY price DESC
	) price_rank 
FROM
	products;

这是输出:

img

在此示例中,我们跳过了PARTITION BY子句,因此DENSE_RANK()函数将整个结果集视为单个分区。

DENSE_RANK()函数根据ORDER BY子句指定的从高到低的价格顺序为每个产品分配排名。

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

以下示例为每个产品组中的每个产品分配排名:

SELECT
	product_id,
	product_name,
	group_id,
	price,
	DENSE_RANK () OVER ( 
		PARTITION BY group_id
		ORDER BY price DESC
	) price_rank 
FROM
	products;

该图显示了输出:

img

在此示例中,PARTITION BY子句将产品分配到产品组中。ORDER BY子句按价格从高到低对每组中的产品进行排序,之后对每个产品组应用DENSE_RANK()函数。

3) 带 CTE 的 PostgreSQL DENSE_RANK() 函数的示例

以下语句使用带有 CTE 的DENSE_RANK()函数返回每个产品组中最昂贵的产品:

WITH cte AS(
	SELECT
		product_id,
		product_name,
		group_id,
		price,
		DENSE_RANK () OVER ( 
			PARTITION BY group_id
			ORDER BY price DESC
		) price_rank 
	FROM
		products
) 
SELECT 
	product_id, 
	product_name, 
	price
FROM 
	cte
WHERE 
	price_rank = 1;

PostgreSQL DENSE_RANK Function top rows example

在本教程中,您学习了如何使用 PostgreSQL 的DENSE_RANK()函数,计算结果集分区内每一行的排名,且排名值之间没有间隙。