【问题标题】: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。