【问题标题】:How to get total amount per previous weeks如何获得前几周的总金额
【发布时间】:2021-07-30 06:57:27
【问题描述】:

例如,我有这张表:

Date amount
2021-02-16T21:06:38 10
2021-02-16T21:07:01 5
2021-02-17T01:10:12 -1
2021-02-19T12:00:00 3
2021-02-24T12:00:00 20
2021-02-25T12:00:00 -1

我想要每周所有前几周的总金额。所以这种情况下的结果是:

Date amount
2021-02-15 0
2021-02-22 17
2021-03-01 36

注意:日期现在是每周的开始时间(星期一)。 任何帮助将不胜感激。

【问题讨论】:

    标签: sql postgresql window-functions


    【解决方案1】:

    试试这个:

    select week_date, sum(amount) over (order by week_date ) 
    from (
    SELECT date(date_) + cast(abs(extract(dow FROM date_) -7 ) + 1 as int) "week_date",
    sum(amount) "amount"
    from example group by 1) t 
    

    DEMO

    Above Query 将仅涵盖有交易记录的那一周。如果您想涵盖所有缺失的一周,请尝试以下查询:

    with cte as (
    SELECT date(date_) + cast(abs(extract(dow FROM date_) -7 ) + 1 as int) "week_date",
    sum(amount) "amount"
    from example group by 1
    )
    select 
    t1."Date",coalesce(sum(cte.amount) over (order by t1."Date"),0)
    from cte right join 
    (select generate_series(min(week_date)- interval '1 week', max(week_date),interval '1 week') "Date" from cte) t1 on cte.week_date=t1."Date"
    

    DEMO

    【讨论】:

      【解决方案2】:

      使用generate_series() 生成您想要的日期。然后使用left join 将数据带入并以累积和汇总:

      select gs.week,
             coalesce(sum(e.amount), 0) as week_amount,
             sum(coalesce(sum(e.amount), 0)) over (order by gs.week) as running_amount
      from generate_series('2021-02-15'::date, '2021-03-01'::date, interval '1 week') gs(week) left join
           example e
           on e.date < gs.week and
              e.date >= gs.week - interval '1 week'
      group by gs.week
      order by gs.week;
      

      Here 是一个 dbfiddle。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-11
        • 1970-01-01
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        相关资源
        最近更新 更多