Home > Mobile >  Consecutive n week calculation
Consecutive n week calculation

Time:10-13

I have a table consisting of 3 columns: Product, Week, Units Sold. I am trying to come up with a table to show the best consecutive 4 week sales.

I have tried several different window analytical functions and can’t seem to get what I need.

This is the input.


PRODUCT WEEK SALES 
ICE     1   17
ICE     2   20
ICE     3   17
ICE     4   10
ICE     5   12
ICE     6   13
ICE     7    2
ICE     8   25
WATER   1   25
WATER   2   20
WATER   3   9
WATER   4   7
WATER   5   24
WATER   6   16
WATER   7   10
WATER   8   16
SODA    1   22
SODA    2   2
SODA    3   10
SODA    4   24
SODA    5   9
SODA    6   20
SODA    7   9
SODA    8   21

This is the output.

PRODUCT BEST_4_WK   BEST_4_WK_SALE
ICE     1-4            64
WATER   5-8            66
SODA    3-6            63

I think I need to use LAG() (for summing the sales), MIN(), MAX() casting as string concatenation (for the weeks). I tried for hours and couldn’t get it. Thank you for your help!

CodePudding user response:

Try this

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

enter image description here

  • Related