Oracle表值向下填充:非空值覆盖后续空值的SQL查询实现
Oracle 非空值向下填充SQL实现方案
原始表结构
| Key | values |
|---|---|
| 1 | null |
| 2 | value1 |
| 3 | null |
| 4 | null |
| 5 | null |
| 6 | value2 |
| 7 | null |
| 8 | null |
期望结果
| Key | values |
|---|---|
| 1 | null |
| 2 | value1 |
| 3 | value1 |
| 4 | value1 |
| 5 | value1 |
| 6 | value2 |
| 7 | value2 |
| 8 | value2 |
可以通过Oracle的分析函数快速实现需求,以下是两种可靠方案:
方案1:使用LAST_VALUE分析函数
SELECT "Key", LAST_VALUE("values" IGNORE NULLS) OVER ( ORDER BY "Key" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS filled_values FROM your_table_name;
说明:
IGNORE NULLS参数让函数跳过NULL值,只取最近的非空值ORDER BY "Key"保证按主键顺序处理数据- 窗口范围限定为从第一行到当前行,确保每个NULL都填充最近的前置非空值
方案2:分组+MAX()分析函数
WITH grouped_data AS ( SELECT "Key", "values", -- 累加非空值次数生成分组ID,每个非空值开启新分组 SUM(CASE WHEN "values" IS NOT NULL THEN 1 ELSE 0 END) OVER (ORDER BY "Key") AS group_id FROM your_table_name ) SELECT "Key", MAX("values") OVER (PARTITION BY group_id) AS filled_values FROM grouped_data;
说明:
- 先通过累加逻辑为连续的NULL和前置非空值分配同一个分组ID
- 在每个分组内取
MAX("values")(分组内唯一非空值)实现填充
注意:将上述SQL中的your_table_name替换为你的实际表名即可。
内容的提问来源于stack exchange,提问作者Firc
相关产品推荐
相关产品推荐

