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

Oracle SQL:如何用最近非空历史值填充Null值?

Oracle SQL 用最近非空值填充连续空的组别字段

你用LAG函数只能取上一行的数值,遇到连续空值(比如Feb、Mar)就没办法回溯到更早的有效组别(Jan的Med),这里给你两种可行的解决办法:

方法1:分组标记法(兼容所有Oracle版本)

先给每个有效组别行标记分组ID,连续的空值会和上一个有效组别归为同一组,再在组内取有效组别值:

SELECT 
    日期,
    员工编号,
    销售额,
    MAX(CASE WHEN 组别 != '---' THEN 组别 END) OVER (PARTITION BY 员工编号, grp) AS 组别
FROM (
    SELECT 
        日期,
        员工编号,
        销售额,
        组别,
        -- 遇到有效组别就累加1,生成分组ID
        SUM(CASE WHEN 组别 != '---' THEN 1 ELSE 0 END) OVER (
            PARTITION BY 员工编号 
            ORDER BY 日期
        ) AS grp
    FROM 你的表名
) t
ORDER BY 日期;

方法2:FIRST_VALUE+IGNORE NULLS(Oracle 12c及以上版本可用)

利用Oracle的IGNORE NULLS特性,直接取当前行及之前所有行里的第一个非空组别值:

SELECT 
    日期,
    员工编号,
    销售额,
    FIRST_VALUE(CASE WHEN 组别 != '---' THEN 组别 END IGNORE NULLS) OVER (
        PARTITION BY 员工编号 
        ORDER BY 日期 
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS 组别
FROM 你的表名
ORDER BY 日期;

两种方法都能得到你要的结果:把连续空的---替换成最近的非空组别值,比如Feb、Mar显示Med,May显示Low,Jul显示High。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:35:18