SQL Oracle 中基于 7 天周期的总和值
sum values based on 7-day cycle in SQL Oracle
我有日期和一些值,我想对从第一个日期开始的 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
with match_recognize 很容易 current_day < first_day + 7 作为模式的条件,但请不要使用 match_recognize 子句作为解决方案!!!
一种方法是递归 CTE:
with tt as (
select dte, value, row_number() over (order by dte) as seqnum
from t
),
cte (dte, value, seqnum, firstdte) as (
select tt.dte, tt.value, tt.seqnum, tt.dte
from tt
where seqnum = 1
union all
select tt.dte, tt.value, tt.seqnum,
(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 是一个 db<>fiddle.
我有日期和一些值,我想对从第一个日期开始的 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
with match_recognize 很容易 current_day < first_day + 7 作为模式的条件,但请不要使用 match_recognize 子句作为解决方案!!!
一种方法是递归 CTE:
with tt as (
select dte, value, row_number() over (order by dte) as seqnum
from t
),
cte (dte, value, seqnum, firstdte) as (
select tt.dte, tt.value, tt.seqnum, tt.dte
from tt
where seqnum = 1
union all
select tt.dte, tt.value, tt.seqnum,
(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 是一个 db<>fiddle.