如何在Redshift中用下一行effective_date值回填空值?
在Redshift中用后续非空值回填effective_date列空值的实现方法
要实现将effective_date列的空值用该行之后最近的非空值回填(比如第一个空值替换为2022-09-05 02:32:29.940416),可以利用Redshift支持的窗口函数FIRST_VALUE结合IGNORE NULLS来完成,具体操作如下:
1. 查询回填后的数据(不修改原表)
假设你的表名为your_table,且有一个能确定行顺序的字段(比如自增主键id、创建时间戳等),执行以下SQL即可得到回填后的结果:
SELECT id, -- 替换为你的其他需要保留的列 other_column1, other_column2, FIRST_VALUE(effective_date IGNORE NULLS) OVER ( ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS filled_effective_date FROM your_table;
逻辑说明:
FIRST_VALUE(effective_date IGNORE NULLS):在指定窗口范围内,跳过所有空值,取第一个出现的非空effective_date值ORDER BY id:按行顺序字段排序,保证“下一行”的逻辑符合业务预期ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING:窗口范围从当前行延伸到表的最后一行,确保能捕获当前行之后的所有非空值
2. 直接更新原表的空值
如果需要将回填结果直接写入原表,可使用子查询结合UPDATE语句:
UPDATE your_table SET effective_date = sub.filled_effective_date FROM ( SELECT id, FIRST_VALUE(effective_date IGNORE NULLS) OVER ( ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS filled_effective_date FROM your_table ) AS sub WHERE your_table.id = sub.id AND your_table.effective_date IS NULL;
注意事项
- 排序字段(如示例中的
id)必须能准确代表行的先后顺序,否则回填的值会不符合预期 - 如果表的最后一行
effective_date为空,由于后面没有可回填的非空值,该空值会保留,需根据业务需求单独处理
内容的提问来源于stack exchange,提问作者Jwan622
相关产品推荐
相关产品推荐

