八月 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;
第四步,使用DENSE_RANK()
函数为结果集中的每一行分配排名:
SELECT
c,
DENSE_RANK() OVER (
ORDER BY c
) dense_rank_number
FROM
dense_ranks;
这是输出:
PostgreSQL DENSE_RANK()
函数示例
我们将使用products
表来演示DENSE_RANK()
函数。
1) 在结果集上使用 PostgreSQL DENSE_RANK()
函数的示例
此语句使用DENSE_RANK()
函数按标价对产品进行排名:
SELECT
product_id,
product_name,
price,
DENSE_RANK () OVER (
ORDER BY price DESC
) price_rank
FROM
products;
这是输出:
在此示例中,我们跳过了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;
该图显示了输出:
在此示例中,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()
函数,计算结果集分区内每一行的排名,且排名值之间没有间隙。
了解更多
PostgreSQL 教程:窗口函数
PostgreSQL 文档:窗口函数