Redshift SQL:按用户分区填充最后一个非空值的实现方法
填充用户购买记录中最后一个非空的purchase_amount值
要实现将null的purchase_amount替换为用户最近一次的非空购买金额,你需要的是**向前填充(forward fill)**逻辑,LEAD函数是向后取数,方向不对,自然无法解决问题。以下是不同SQL环境下的可行方案:
方案1:支持IGNORE NULLS的数据库(PostgreSQL 11+、BigQuery、Oracle等)
直接使用LAST_VALUE函数并搭配IGNORE NULLS参数,按用户分区、日期排序,取当前行及之前所有行中最后一个非空的购买金额:
SELECT date, user_id, LAST_VALUE(purchase_amount IGNORE NULLS) OVER ( PARTITION BY user_id ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS purchase_amount FROM your_table;
方案2:不支持IGNORE NULLS的数据库(MySQL 8.0及以下、老版本SQL Server等)
通过生成分组标识的方式实现向前填充:
- 先为每个用户的非空购买金额生成递增的分组ID,遇到非空值时分组ID加1;
- 再按用户和分组ID取组内的最大购买金额(即该分组对应的非空值)。
WITH grouped_data AS ( SELECT date, user_id, purchase_amount, -- 生成分组标识:每遇到非空金额则分组+1 SUM(CASE WHEN purchase_amount IS NOT NULL THEN 1 ELSE 0 END) OVER ( PARTITION BY user_id ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS value_group FROM your_table ) SELECT date, user_id, MAX(purchase_amount) OVER (PARTITION BY user_id, value_group) AS purchase_amount FROM grouped_data;
内容的提问来源于stack exchange,提问作者titutubs
相关产品推荐
相关产品推荐

