You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:42:18