如何用LAG()函数生成含后续年份行的前值列?
解决方法说明
直接用lag(value) OVER(order by Year)得不到2024行的核心原因是原数据表中根本没有2024年的记录,LAG函数只能基于现有行做偏移计算,没法自动生成新行。要实现需求,得先补全年份序列,再关联原数据计算偏移值,步骤如下:
步骤1:生成包含目标年份的连续序列
首先需要构造包含2022、2023、2024的年份列表,不同数据库的实现方式略有差异:
通用递归CTE写法(适用于MySQL 8.0+、SQL Server、PostgreSQL等支持CTE的数据库)
WITH year_series AS ( SELECT 2022 AS Year UNION ALL SELECT Year + 1 FROM year_series WHERE Year < 2024 )
PostgreSQL 专属写法
SELECT generate_series(2022, 2024) AS Year
步骤2:关联原数据并计算上年值
将生成的年份序列与原数据表左连接,再用LAG函数计算Value_PY:
WITH year_series AS ( SELECT 2022 AS Year UNION ALL SELECT Year + 1 FROM year_series WHERE Year < 2024 ) SELECT ys.Year, t.Value, LAG(t.Value) OVER(ORDER BY ys.Year) AS Value_PY FROM year_series ys LEFT JOIN your_table t ON ys.Year = t.Year ORDER BY ys.Year;
执行这段SQL后,就能得到你期望的结果:
| Year | Value | Value_PY |
|---|---|---|
| 2022 | 1000 | null |
| 2023 | 500 | 1000 |
| 2024 | null | 500 |
关键说明
不需要给LAG函数额外添加参数,问题的核心是先补全缺失的年份行,让2024年出现在结果集中,之后LAG函数才能正常计算它的上年值。
内容的提问来源于stack exchange,提问作者xieeerrWW
相关产品推荐
相关产品推荐

