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;
输出: