Snowflake中基于actv_ind规则生成last_value列的技术问询
解决方案:用Snowflake SQL实现最近激活值填充
要实现你需要的last_value逻辑,核心是将激活行(actv_ind=1)的qlfd_lvl作为锚点,为后续非激活行填充最近的锚点值。Snowflake的LAST_VALUE函数配合IGNORE NULLS参数可以高效处理这种“向前填充”场景,无需复杂的LAG嵌套。
实现代码
WITH sample_data AS ( SELECT * FROM VALUES ('20230301', 4, 1), ('20230302', 2, 1), ('20230303', 3, 0), ('20230304', 1, 0), ('20230305', 3, 1), ('20230306', 2, 0), ('20230307', 1, 0) AS t(date, qlfd_lvl, actv_ind) ) SELECT date, qlfd_lvl, actv_ind, LAST_VALUE(CASE WHEN actv_ind = 1 THEN qlfd_lvl END IGNORE NULLS) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS last_value FROM sample_data ORDER BY date;
逻辑说明
- 锚点值提取:用
CASE WHEN actv_ind = 1 THEN qlfd_lvl END只保留激活行的qlfd_lvl,非激活行返回NULL - 最近值填充:
LAST_VALUE(...) IGNORE NULLS在窗口范围内(从第一行到当前行)忽略NULL,取最后一个非NULL的锚点值,也就是最近的激活行qlfd_lvl - 顺序保证:
ORDER BY date确保数据按日期顺序处理,保证“最近”的逻辑正确性
执行后结果将完全匹配你提供的示例last_value列。
内容的提问来源于stack exchange,提问作者K S
相关产品推荐
相关产品推荐

