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

如何使用SQL LAG函数持续填充空值至下一个非空值出现?

用前一个非空值持续填充SQL中的空值(直到下一个非空值)

你的问题在于LAG函数只能获取固定偏移量的前一行/前N行值,没法跨越多行空值去取最近的非空值。要实现"用前一个非空值填充后续所有空行,直到下一个非空值出现"的需求,需要换一种分组填充的思路。

解决方案代码

WITH ranked_data AS (
    SELECT 
        PersonID,
        FirstDateofTermYear,
        PhysicalOVRARiskRating,
        PsychologicalOVRARiskRating,
        -- 为Physical列生成分组ID:每遇到非空值,分组ID递增
        COUNT(PhysicalOVRARiskRating) OVER (PARTITION BY PersonID ORDER BY FirstDateofTermYear) AS physical_group,
        -- 为Psychological列生成分组ID:逻辑同上
        COUNT(PsychologicalOVRARiskRating) OVER (PARTITION BY PersonID ORDER BY FirstDateofTermYear) AS psychological_group
    FROM [BI].[vw_Fact_OVT_CCI_V3]
    WHERE PersonID = '0258077'
)
SELECT 
    PersonID,
    FirstDateofTermYear,
    -- 组内取唯一非空值填充所有行
    MAX(PhysicalOVRARiskRating) OVER (PARTITION BY PersonID, physical_group) AS PhysicalOVRARiskRating,
    MAX(PsychologicalOVRARiskRating) OVER (PARTITION BY PersonID, psychological_group) AS PsychologicalOVRARiskRating
FROM ranked_data
ORDER BY FirstDateofTermYear;

代码逻辑说明

  1. 分组ID生成:
    • COUNT(列) OVER(PARTITION BY PersonID ORDER BY FirstDateofTermYear):COUNT会忽略NULL值,所以每遇到一个非空的PhysicalOVRARiskRating或PsychologicalOVRARiskRating,对应的分组ID就会加1。这样,连续的空行都会被分到最近的非空值所在的组里。
  2. 组内填充:
    • MAX(列) OVER(PARTITION BY PersonID, 分组ID):每个分组内只有一个非空值,用MAX(或MIN)就能取出这个非空值,填充组内所有空行,直到下一个非空值出现(此时分组ID更新,进入新的分组)。

结果验证

运行这段代码后,PsychologicalOVRARiskRating列会按照你的预期填充:2020-04-28之后的所有空行被填充为MEDIUM,直到2022-04-26出现LOW,后续空行则填充为LOW,完全匹配你的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:45:42