📜  PostgreSQL – NTH_VALUE函数

📅  最后修改于: 2022-05-13 01:57:15.866000             🧑  作者: Mango

PostgreSQL – NTH_VALUE函数

PostgreSQL,所述NTH_VALUE()函数是用来获取从在结果集的值n行。

这是 NTH_VALUE()函数的语法:

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

我们来分析一下上面的语法:

  • 表达是由该查询是要进行的柱或在其上NTH_VALUE()函数所操作表达
  • 偏移量是一个正整数,集根据针对值的表达式计算所述窗口中的第一行的行号。
  • PARTITION BY子句分配结果集的行插入到所述NTH_VALUE()函数适用分区
  • ORDER BY子句中使用排序的查询结果。
  • 所述frame_clause用于定义所使用的分区的子集(或帧)。

示例 1:

首先,创建两个名为杂货和杂货的表:



CREATE TABLE items(
    group_id serial PRIMARY KEY,
    group_name VARCHAR (100) NOT NULL
);

CREATE TABLE groceries(
    gro_id serial PRIMARY KEY,
    gro_name VARCHAR (100) NOT NULL,
    price DECIMAL (11, 2),
    group_id INT NOT NULL,
    FOREIGN KEY (group_id) REFERENCES grocery (group_id)
);

现在向其中添加一些数据:

INSERT INTO groceries (group_name)
VALUES
    ('Cereal'),
    ('Fruit'),
    ('Vegitable');

INSERT INTO groceries (group_name, group_id, price)
VALUES
    ('Wheat', 1, 30),
    ('Rice', 1, 40),
    ('Barley', 1, 50),
    ('Corn', 1, 90),
    ('Apple', 2, 120),
    ('Banana', 2, 70),
    ('Pear', 2, 70),
    ('Mango', 2, 80),
    ('Brinjal', 3, 70),
    ('Capsicum', 3, 150),
    ('Potato', 3, 20);

以下语句使用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;

输出:

示例 2:

以下语句使用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;

输出: