Amazon Redshift中如何获取并填充上一期A型支付计划的到期日期?
解决方案
假设你的支付计划表名为payment_plans,包含字段user_id(用于按用户分组追踪计划)、plan_type(判断是否为A型)、created_date、next_created_date。可以通过带IGNORE NULLS的窗口函数实现需求,无需自连接即可避免重复:
SELECT user_id, plan_type, created_date, next_created_date, -- 追踪最近的上一期A型计划的next_created_date LAST_VALUE(CASE WHEN plan_type = 'A' THEN next_created_date END IGNORE NULLS) OVER ( PARTITION BY user_id ORDER BY created_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS last_a_plan_next_date FROM payment_plans;
逻辑说明
- 用
CASE WHEN标记:仅当计划是A型时,保留它的next_created_date,否则返回NULL LAST_VALUE(...) IGNORE NULLS:在按用户分组、创建日期排序的窗口内,忽略NULL值,取从第一条记录到当前记录范围内最后一个非NULL的值——也就是最近的上一期A型计划的next_created_date- 非A型计划的行,会自动继承最近的上一个A型计划的对应值,完全符合需求
为什么自连接会产生重复?
当你用自连接关联"当前记录之前的A型计划"时,如果用户有多个历史A型计划,每条当前记录会匹配所有符合条件的历史A型计划,自然产生重复行。而窗口函数直接锁定最近的那一个,避免了多对多关联的问题。
如果你的表没有user_id(或者需要按其他维度分组),只需调整PARTITION BY后的字段即可。
内容的提问来源于stack exchange,提问作者Yasmeen karachiwala
相关产品推荐
相关产品推荐

