如何使用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;
代码逻辑说明
- 分组ID生成:
COUNT(列) OVER(PARTITION BY PersonID ORDER BY FirstDateofTermYear):COUNT会忽略NULL值,所以每遇到一个非空的PhysicalOVRARiskRating或PsychologicalOVRARiskRating,对应的分组ID就会加1。这样,连续的空行都会被分到最近的非空值所在的组里。
- 组内填充:
MAX(列) OVER(PARTITION BY PersonID, 分组ID):每个分组内只有一个非空值,用MAX(或MIN)就能取出这个非空值,填充组内所有空行,直到下一个非空值出现(此时分组ID更新,进入新的分组)。
结果验证
运行这段代码后,PsychologicalOVRARiskRating列会按照你的预期填充:2020-04-28之后的所有空行被填充为MEDIUM,直到2022-04-26出现LOW,后续空行则填充为LOW,完全匹配你的预期结果。
内容的提问来源于stack exchange,提问作者Pratik Utture
相关产品推荐
相关产品推荐

