You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:基于前序非空值填充空行的技术需求

前向填充非空值后的空记录

初始数据

year |  status
--------------
2018 | null
2019 | 1
2020 | null
2021 | null
2022 | 0
2023 | null
2024 | 1
2025 | null

需求

从第一个非空status值之后的空行开始,用前一条记录的有效值填充空行,第一个非空值之前的null保持不变。

预期结果

year |  status
--------------
2018 | null
2019 | 1
2020 | 1
2021 | 1
2022 | 0
2023 | 0
2024 | 1
2025 | 1

解决方案

方法一:支持IGNORE NULLS的数据库(PostgreSQL 11+、SQL Server 2022+、Oracle等)

利用窗口函数LAST_VALUE结合IGNORE NULLS特性,同时用累加计数判断是否已进入需要填充的阶段:

SELECT 
    year,
    CASE 
        -- 第一个非空值出现前,保留原null
        WHEN SUM(CASE WHEN status IS NOT NULL THEN 1 ELSE 0 END) OVER (ORDER BY year ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) = 0
        THEN status
        -- 后续空值用最近的非空值填充
        ELSE LAST_VALUE(status IGNORE NULLS) OVER (ORDER BY year ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    END AS status
FROM your_table
ORDER BY year;

方法二:MySQL(不支持IGNORE NULLS)

使用用户变量追踪最近的有效值和是否已遇到第一个非空值:

SELECT 
    year,
    CASE 
        -- 未遇到第一个非空值时,null保持不变
        WHEN @has_non_null = 0 AND status IS NULL THEN NULL
        -- 遇到非空值则更新变量,空值则沿用变量值
        ELSE @last_status := COALESCE(status, @last_status)
    END AS status
FROM your_table,
     -- 初始化变量
     (SELECT @last_status := NULL, @has_non_null := 0) AS init
ORDER BY year;

内容的提问来源于stack exchange,提问作者franco_b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:35:05