PostgreSQL 教程: nth_value 函数

八月 27, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的NTH_VALUE()函数,从结果集中的第 n 行获取值。

PostgreSQL NTH_VALUE() 函数介绍

NTH_VALUE()函数返回结果集有序分区中第 n 行的值。

NTH_VALUE()函数的语法如下:

NTH_VALUE(expression, offset)
OVER (
    [PARTITION BY partition_expression]
    [ ORDER BY sort_expression [ASC | DESC]
    frame_clause ]
)

让我们详细研究一下NTH_VALUE()函数的语法。

expression

expressionNTH_VALUE()函数操作的目标列或表达式。

offset

offset是一个正整数(大于零),用于确定相对于表达式计算所依据的窗口中第一行的行号。

PARTITION BY partition_expression

PARTITION BY子句将结果集的行分配到NTH_VALUE()函数应用的分区中。

ORDER BY sort_expression

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

frame clause

frame_clause定义当前分区的子集(或框架)。

PostgreSQL NTH_VALUE() 函数示例

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

img

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

此示例使用NTH_VALUE()函数返回所有产品以及第二昂贵的产品:

SELECT 
    product_id,
    product_name,
    price,
    NTH_VALUE(product_name, 2) 
    OVER(
        ORDER BY price DESC
        RANGE BETWEEN 
            UNBOUNDED PRECEDING AND 
            UNBOUNDED FOLLOWING
    )
FROM 
    products;

这是输出:

PostgreSQL NTH_VALUE function over a result set example

在这个例子中:

  • ORDER BY子句将所有产品按价格从高到低排序。
  • 框架子句定义框架从结果集的开始行开始,到结果集的结束行结束。
  • 函数NTH_VALUE()返回排序和组帧后结果集第二行的product_name列中的值。

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

此示例使用NTH_VALUE()函数返回每个产品组中第二昂贵产品的所有产品:

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

下图说明了输出:

PostgreSQL NTH_VALUE function over a partition example

在这个例子中,

  • PARTITION BY子句将产品分发到由group_id列中的值指定的产品组(或分区)中。
  • ORDER BY子句对每个产品组中的产品从高到低进行排序。
  • 框架子句将整个分区定义为框架。
  • NTH_VALUE()函数返回每个产品组第二行的产品名称。

现在,您已经知道了如何使用 PostgreSQL 的NTH_VALUE()函数,从结果集的第 n 行获取值。