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
相关产品推荐
相关产品推荐

