问题描述
我有日期和一些值,我想对从第一个日期开始的 7 天周期内的值求和。
date value
01-01-2021 1
02-01-2021 1
05-01-2021 1
07-01-2021 1
10-01-2021 1
12-01-2021 1
13-01-2021 1
16-01-2021 1
18-01-2021 1
22-01-2021 1
23-01-2021 1
30-01-2021 1
这是我的输入数据,包含 4 个组,以查看哪些组将创建 7 天周期。 它应该从第一个日期开始,并在包含第一个日期后的 7 天内总结所有值。 然后开始一个新组,第二天加上另一个 7 天,10-01 到 17-01,然后从 18-01 到 25-01 再开始一个新组,依此类推。 所以输出将是
group1 4
group2 4
group3 3
group4 1
使用 match_recognize 将很容易 current_day
解决方法
一种方法是递归 CTE:
with tt as (
select dte,value,row_number() over (order by dte) as seqnum
from t
),cte (dte,seqnum,firstdte) as (
select tt.dte,tt.value,tt.seqnum,tt.dte
from tt
where seqnum = 1
union all
select tt.dte,(case when tt.dte < cte.firstdte + interval '7' day then cte.firstdte else tt.dte end)
from cte join
tt
on tt.seqnum = cte.seqnum + 1
)
select firstdte,sum(value)
from cte
group by firstdte
order by firstdte;
这会按第一个日期标识组。如果需要数字,可以使用 row_number() over (order by firstdte)
。
Here 是一个 dbfiddle。