PostgreSQL 教程: last_value 函数

八月 27, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的LAST_VALUE()函数,获取结果集有序分区中的最后一个值。

PostgreSQL LAST_VALUE() 函数介绍

LAST_VALUE()函数返回结果集有序分区中的最后一个值。

LAST_VALUE()函数的语法如下:

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

在这个语法中:

expression

expression可以是根据结果集有序分区中最后一行的值计算的表达式、列或子查询

expression必须返回单个值。而且它不能是一个窗口函数

PARTITION BY 子句

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

如果省略PARTITION BY子句,LAST_VALUE()函数会将整个结果集视为单个分区。

ORDER BY 子句

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

frame_clause

frame_clause定义当前分区中应用LAST_VALUE()函数的行子集。

PostgreSQL LAST_VALUE() 函数示例

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

img

以下是products表的数据内容:

img

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

以下示例使用LAST_VALUE()函数返回所有产品以及价格最高的产品:

SELECT 
    product_id,
    product_name,
    price,
    LAST_VALUE(product_name) 
    OVER(
        ORDER BY price
        RANGE BETWEEN 
            UNBOUNDED PRECEDING AND 
            UNBOUNDED FOLLOWING
    ) highest_price
FROM 
    products;

PostgreSQL LAST_VALUE over result set example

在这个例子中:

  • 我们跳过了LAST_VALUE()函数中的PARTITION BY子句,因此,LAST_VALUE()函数将整个结果集视为单个分区。
  • ORDER BY子句按价格从低到高对产品进行排序。
  • LAST_VALUE()选取结果集中最后一行的产品名称。

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

以下示例使用LAST_VALUE()函数返回所有产品以及每个产品组最昂贵的产品:

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

PostgreSQL LAST_VALUE over partition example

在这个例子中:

  • PARTITION BY子句按组 ID 将行划分为由组 ID 为 1、2 和 3 指定的三个分区。
  • ORDER BY子句对每个产品组(或分区)中的产品从低到高进行排序。
  • RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING子句定义了从每个分区的第一行开始到最后一行结束的框架。
  • LAST_VALUE()函数分别应用于每个分区,并返回每个分区中最后一行的产品名称。

在本教程中,您学习了如何使用 PostgreSQL 的LAST_VALUE()窗口函数,返回结果集有序分区中的最后一个值。