【问题标题】:Teradata SQL Cumulative Sum over date from another tableTeradata SQL Cumulative Sum over date from another table
【发布时间】:2022-01-05 17:28:54
【问题描述】:

案例简介;客户订阅了每月服务,续订日期可以是当月的任何一天,而不仅仅是月初,他也可以提前或延迟(到期日之前/之后)续订,然后他从配额包中消费每天,也许他可以在续订日期之前用完他所有的捆绑配额。所以我需要根据服务续订日期而不是日历日期来计算Consumption_ValueRunning Total 我有两张桌子:

  • 第一个:Consumption_T,其中包含特定优惠 ID 的订阅者每日消费信息,如下例所示
|Subs_ID|Consumption_Date|Offer_ID|Quota|Consumption_Value|
|-------+----------------+--------+-----+-----------------|
|12345  |22-01-2021      |123     |140  |1                |
|12345  |23-01-2022      |123     |140  |3                |
|12345  |24-01-2023      |123     |140  |5                |
|12345  |25-01-2022      |123     |140  |3                |
|12345  |26-01-2023      |123     |140  |6                |
|12345  |27-01-2024      |123     |140  |4                |
|…      |…               |…       |…    |…                |
|12345  |15-02-2021      |123     |140  |10               |
|12345  |22-02-2021      |123     |140  |4                |
  • 另一张表Renewal_T 用于续订日期,如下所示:
|Subs_ID|Renewal_Date|Offer_ID|
|-------+------------+--------|
|12345  |22-01-2021  |123     |
|12345  |22-02-2021  |123     |
|12345  |18-03-2022  |123     |
|12345  |19-04-2022  |123     |
|12345  |15-05-2023  |123     |
|12345  |16-06-2023  |123     |

所需的输出将如下所示

|Subs_ID|Consumption_Date|Offer_ID|Quota|Consumption_Value|Running Total|
|-------+----------------+--------+-----+-----------------+-------------|
|12345  |22-01-2021      |123     |140  |1                |1            |
|12345  |23-01-2022      |123     |140  |3                |4            |
|12345  |24-01-2023      |123     |140  |5                |9            |
|12345  |25-01-2022      |123     |140  |3                |12           |
|12345  |26-01-2023      |123     |140  |6                |18           |
|12345  |27-01-2024      |123     |140  |4                |22           |
|…      |…               |…       |…    |…                |…            |
|12345  |15-02-2021      |123     |140  |10               |140          |
|12345  |22-02-2021      |123     |140  |4                |4            |

【问题讨论】:

  • 您的输出似乎与renewal_date 无关。使用consumption_date 看起来像是一个直线总和。
  • 如果日期之前的运行总数是 135(所以还剩 5 个),而今天的消耗量是 10 怎么办?
  • @Andrew 我需要renewal_date,因为配额会根据这个日期更新,而不是每个月开始更新。

标签: sql join teradata cumulative-sum


【解决方案1】:

数据模型不是很清楚;续订期适用于 Subs_Id 还是 Subs_Id+Offer_Id 组合?您确定 Consumption_date 和 Renewal_Date 示例的年份是否正确(2022、2023 等);这些不连贯。如果我假设续订的主键是 Subs_Id+Offer_Id+Renewal_Date,那么这将产生您想要的:

 select T1.*, 
      sum(Consumption_Value) 
         over (partition by T1.Subs_Id, T1.Offer_ID, SubsPeriod.RenewalDate_From 
               order by Consumption_Date 
               rows between unbounded preceding and current row) as "Running Total"
from Consumption_T as T1
     
    inner join
    (select 
          Subs_Id
        , Offer_Id
        , Renewal_Date as RenewalDate_From
        , LEAD(Renewal_Date-1,1,date '3000-01-01') 
               over (partition by Subs_ID, Offer_Id order by Renewal_Date) as RenewalDate_To
    from Renewal_T
    ) SubsPeriod
    on SubsPeriod.Subs_Id=T1.Subs_Id
    and SubsPeriod.Offer_Id=T1.Offer_Id
    and T1.Consumption_Date 
        between SubsPeriod.RenewalDate_From and SubsPeriod.RenewalDate_To
order by T1.Subs_Id, T1.OffeR_Id, Consumption_date      

假设示例日期均为 2021 年。

子查询SubsPeriod推导出续费周期(含from&to日期,含),然后我们将消费数据加入这些周期,期望消费日期在续费周期内。然后,我们计算每个 subs_id、offer_id、续订期的运行总计。

【讨论】:

  • 这个答案有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
相关资源
最近更新 更多