📜  PostgreSQL – 滞后函数

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

PostgreSQL – 滞后函数

PostgreSQL 中 LAG()函数用于访问在特定物理偏移处恰好位于当前行之前的行。 LAG() 在比较当前行和前一行的值时派上用场。

下面显示了 LAG()函数的语法:

Syntax:
LAG(expression [, offset [, default_value]]) 
OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

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

  • 表达式用于设置在指定偏移处比较当前行和前一行的比较基础。它可以是以下任何一种,可以是列、表达式或子查询。
  • 偏移是用于设置在查询的行数的正整数出现在当前行之前。该偏移可以是表达式,子查询,或一列。如果未指定,则默认为 1。
  • LAG()函数将返回DEFAULT_VALUE 偏移量超出分区范围时。
  • LAG()函数应用于由 PARTITION BY 子句创建的分区。如果未指定分区,该函数会将整个结果集视为单个分区。
  • ORDER BY子句设置为施加LAG()函数在每个分区中的行的顺序

示例 1:

让我们为名为sales的演示设置一个新表:



CREATE TABLE sales(
    year SMALLINT CHECK(year > 0),
    group_id INT NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    PRIMARY KEY(year, group_id)
);

向其中添加一些数据:

INSERT INTO 
    sales(year, group_id, amount) 
VALUES
    (2018, 1, 1474),
    (2018, 2, 1787),
    (2018, 3, 1760),
    (2019, 1, 1915),
    (2019, 2, 1911),
    (2019, 3, 1118),
    (2020, 1, 1646),
    (2020, 2, 1975),
    (2020, 3, 1516);

这里的 LAG()函数返回当年和上一年的销售额:

WITH cte AS (
    SELECT 
        year, 
        SUM(amount) amount
    FROM sales
    GROUP BY year
) 
SELECT
    year, 
    amount,
    LAG(amount, 1) OVER (
        ORDER BY year
    ) last_year_sales
FROM
    cte;

输出:

示例 2:

此示例使用LAG()函数将当前年度的销售额与每个产品组的前一年的销售额进行比较:

SELECT
    year, 
    amount,
    group_id,
    LAG(amount, 1) OVER (
        PARTITION BY group_id
        ORDER BY year
    ) last_year_sales
FROM
    sales;

输出: