当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


PostgreSQL LAST_VALUE用法及代码示例


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

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

让我们分析以上语法:

  • 表达式可以是根据结果集的有序分区中最后一行的值求值的表达式,列或子查询。表达式必须返回单个值。
  • 这个分区依据子句将结果集的行划分为分区,LAST_VALUE()函数已应用。
  • 这个排序子句指定每个分区中行的排序顺序LAST_VALUE()函数已应用。
  • 这个frame_clause定义当前分区中行的子集,LAST_VALUE()函数已应用。

范例1:

首先,创建两个表命名产品展示 product_groups 进行演示:

CREATE TABLE product_groups (
    group_id serial PRIMARY KEY,
    group_name VARCHAR (255) NOT NULL
);

CREATE TABLE products (
    product_id serial PRIMARY KEY,
    product_name VARCHAR (255) NOT NULL,
    price DECIMAL (11, 2),
    group_id INT NOT NULL,
    FOREIGN KEY (group_id) REFERENCES product_groups (group_id)
);


现在将一些数据插入表中:



INSERT INTO product_groups (group_name)
VALUES
    ('Smartphone'),
    ('Laptop'),
    ('Tablet');

INSERT INTO products (product_name, group_id, price)
VALUES
    ('Microsoft Lumia', 1, 200),
    ('HTC One', 1, 400),
    ('Nexus', 1, 500),
    ('iPhone', 1, 900),
    ('HP Elite', 2, 1200),
    ('Lenovo Thinkpad', 2, 700),
    ('Sony VAIO', 2, 700),
    ('Dell Vostro', 2, 800),
    ('iPad', 3, 700),
    ('Kindle Fire', 3, 150),
    ('Samsung Galaxy Tab', 3, 200);

以下查询使用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;

输出:

范例2:

以下查询使用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;

输出:

相关用法


注:本文由纯净天空筛选整理自RajuKumar19大神的英文原创作品 PostgreSQL – LAST_VALUE Function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。