簡體   English   中英

Teradata SQL 來自另一個表的累積總和

[英]Teradata SQL Cumulative Sum over date from another table

案例簡介; 客戶訂閱了每月服務,續訂日期可以是當月的任何一天,而不僅僅是月初,他也可以提前或延遲(到期日之前/之后)續訂,然后他從配額包中消費每天,也許他可以在續訂日期之前用完他的所有捆綁配額。 所以我需要根據服務續訂日期而不是日歷日期來計算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     |

所需的 output 將如下所示

|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            |

model的數據不是很清楚; 續訂期是否適用於Subs_IdSubs_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、續訂期的運行總計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM