PostgreSQL 教程: first_value 函数

八月 27, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的FIRST_VALUE()函数,返回结果集排序分区中的第一个值。

PostgreSQL FIRST_VALUE() 函数介绍

FIRST_VALUE()函数返回根据结果集排序分区中的第一行计算的值。

以下是FIRST_VALUE()函数的语法:

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

在这个语法中:

expression

expression可以是根据结果集排序分区的第一行计算的表达式、列或子查询。expression必须返回单个值。而且它不能是一个窗口函数

PARTITION BY 子句

PARTITION BY子句将结果集中的行划分为应用FIRST_VALUE()函数的分区。

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

ORDER BY 子句

ORDER BY子句指定应用FIRST_VALUE()函数的每个分区中行的排序顺序。

rows_range_clause

rows_range_clause通过定义分区中的开始和结束进一步限制分区内的行。

PostgreSQL FIRST_VALUE() 函数示例

我们将使用窗口函数教程中创建的products表进行演示:

img

products表中数据如下:

img

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

以下语句使用FIRST_VALUE()函数返回所有产品以及价格最低的产品:

SELECT 
    product_id,
    product_name,
    group_id,
    price,
    FIRST_VALUE(product_name) 
    OVER(
        ORDER BY price
    ) lowest_price
FROM 
    products;

这是结果集:

PostgreSQL FIRST_VALUE Function over a result set

在这个例子中:

  • 由于我们跳过了FIRST_VALUE()函数中的PARTITION BY子句,因此该函数将整个结果集视为单个分区。
  • ORDER BY子句按价格从低到高对产品进行排序。
  • FIRST_VALUE()函数应用于整个结果集,并选取第一行中product_name列的值。

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

该语句使用FIRST_VALUE()函数返回按产品组分组的所有产品。对于每个产品组,它返回价格最低的产品:

SELECT 
    product_id,
    product_name,
	group_id,
    price,
    FIRST_VALUE(product_name) 
    OVER(
	PARTITION BY group_id
        ORDER BY price
        RANGE BETWEEN 
            UNBOUNDED PRECEDING AND 
            UNBOUNDED FOLLOWING
    ) lowest_price
FROM 
    products;

PostgreSQL FIRST_VALUE Function over partition

在这个例子中:

  • PARTITION BY子句按产品组分配产品。
  • ORDER BY子句按价格从低到高对每个产品组(分区)中的产品进行排序。
  • RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING子句定义了每个分区中的框架,从第一行开始到最后一行结束。
  • FIRST_VALUE()函数分别应用于每个分区。

在本教程中,您学习了如何使用 PostgreSQL 的FIRST_VALUE()函数,返回结果集排序分区中的第一个值。