试试这个
with cte as
(
select 'ICE' as product, 1 as week, 17 as sales union all
select 'ICE' as product, 2 as week, 20 as sales union all
select 'ICE' as product, 3 as week, 17 as sales union all
select 'ICE' as product, 4 as week, 10 as sales union all
select 'ICE' as product, 5 as week, 12 as sales union all
select 'ICE' as product, 6 as week, 13 as sales union all
select 'ICE' as product, 7 as week, 2 as sales union all
select 'ICE' as product, 8 as week, 25 as sales union all
select 'WATER' as product, 1 as week, 25 as sales union all
select 'WATER' as product, 2 as week, 20 as sales union all
select 'WATER' as product, 3 as week, 9 as sales union all
select 'WATER' as product, 4 as week, 7 as sales union all
select 'WATER' as product, 5 as week, 24 as sales union all
select 'WATER' as product, 6 as week, 16 as sales union all
select 'WATER' as product, 7 as week, 10 as sales union all
select 'WATER' as product, 8 as week, 16 as sales union all
select 'SODA' as product, 1 as week, 22 as sales union all
select 'SODA' as product, 2 as week, 2 as sales union all
select 'SODA' as product, 3 as week, 10 as sales union all
select 'SODA' as product, 4 as week, 24 as sales union all
select 'SODA' as product, 5 as week, 9 as sales union all
select 'SODA' as product, 6 as week, 20 as sales union all
select 'SODA' as product, 7 as week, 9 as sales union all
select 'SODA' as product, 8 as week, 21 as sales
),cte2 as
(
select *,
sum(sales) over ( partition by product order by week rows between current row and 3 following ) as summed
from cte
)
select product,
cast(week as string)||'-'||cast(week + 3 as string) as week,
summed
from cte2
where 1 = 1
qualify row_number() over (partition by product order by summed desc) = 1
OP
