【问题标题】:sum for trailing 365 days from a purchase date for users用户购买日期后 365 天的总和
【发布时间】:2016-12-09 11:05:28
【问题描述】:

我正在尝试查找从“DT”开始 365 天后的“ID”的金额总和。以下是我正在处理的数据的示例。下表包含购买日期、id 和金额。我想计算从“DT”开始 365 天后的 id 花费的金额。对此的任何帮助将不胜感激。谢谢。

DT      ID  AMT
1/17/15 1   31.74
1/23/15 1   14.33
1/25/15 1   21.76
3/5/15  1   150
6/12/15 1   60
4/23/16 1   16.86
4/25/16 1   60
7/1/16  1   15.57
2/26/15 2   61.9
3/1/15  2   15
2/28/16 2   25

我希望我的输出是

DT      ID  AMT     outstanding_amt
1/17/15 1   31.74   31.74
1/23/15 1   14.33   46.07
1/25/15 1   21.76   67.83
3/5/15  1   150     217.83
6/12/15 1   60      277.83
4/23/16 1   16.86   76.86
4/25/16 1   60      136.86
7/1/16  1   15.57   92.43
2/26/15 2   61.9    61.9
3/1/15  2   15      76.9
2/28/16 2   25      40

我试过sum(amt) over(partition by user_id) 但这给了我所有日期的累积总和。我不知道如何用日期条件来调节它

【问题讨论】:

    标签: sql teradata window-functions


    【解决方案1】:

    一种方法是相关子查询:

    select t.*,
           (select sum(t2.amt)
            from t t2
            where t2.id = t.id and
                  t2.dt <= t.dt and
                  t2.dt > t.dt - interval '365' day
           ) as outstanding_amt
    from t;
    

    使用(id, dt, amt) 上的索引可能具有合理的性能。

    【讨论】:

      【解决方案2】:

      我会像下面的示例一样更改 order by 子句。

      select dt
      , id
      , amt
      , sum(amt) over(order by dt rows unbounded preceding) as rollingsum
      from table
      where 1=1
      and dt between current_date - 365  and current_date
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-09
        • 1970-01-01
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多