Ordered Analytical Function/Iterative Loop

Database

Ordered Analytical Function/Iterative Loop

Hi All,

I have the data in the below format. I need to fill the blanks in the column lifecycle_stage, with the condition

a. if all the preceding values in the column is null, it should substitute the first following non null value

b. if preceding cells have a value, then it should substitute the first preceding non null value

c. if all following cells are null then, it should substitute the first preceding non null value

d. if following cells have value, then it should substitute the first following non null value

Every ID is repeated 39 times, that is for 3 quarters.


party_id            FISC_WEEK_VAL    lifecycle_stage    intended_result

1702829476     2015-W01                                      sales_nurturing

1702829476     2015-W02                                      sales_nurturing

1702829476     2015-W03                                      sales_nurturing

1702829476     2015-W04                                      sales_nurturing 

1702829476     2015-W05                                      sales_nurturing 

1702829476     2015-W06                                      sales_nurturing

1702829476     2015-W07                                      sales_nurturing 

1702829476     2015-W08                                      sales_nurturing 

1702829476     2015-W09                                      sales_nurturing  

1702829476     2015-W10                                      sales_nurturing 

1702829476     2015-W11                                      sales_nurturing 

1702829476     2015-W12                                      sales_nurturing

1702829476     2015-W13                                      sales_nurturing 

1702829476     2015-W14                                      sales_nurturing 

1702829476     2015-W15                                      sales_nurturing  

1702829476     2015-W16                                      sales_nurturing 

1702829476     2015-W17                                      sales_nurturing 

1702829476     2015-W18                                      sales_nurturing 

1702829476     2015-W19                                      sales_nurturing

1702829476     2015-W20                                      sales_nurturing 

1702829476     2015-W21       sales_nurturing       sales_nurturing    

1702829476     2015-W22                                      sales_nurturing

1702829476     2015-W23                                      sales_nurturing

1702829476     2015-W24                                      sales_nurturing 

1702829476     2015-W25                                      sales_nurturing 

1702829476     2015-W26                                      sales_nurturing 

1702829476     2015-W27                                      sales_nurturing  

1702829476     2015-W28                                      sales_nurturing 

1702829476     2015-W29                                      sales_nurturing 

1702829476     2015-W30                                      sales_nurturing  

1702829476     2015-W31            awareness          awareness

1702829476     2015-W32                                      awareness 

1702829476     2015-W33                                      awareness 

1702829476     2015-W34            awareness          awareness 

1702829476     2015-W34            opportunity         opportunity  

1702829476     2015-W34            customer            customer

1702829476     2015-W35                                      customer

1702829476     2015-W36                                      customer

1702829476     2015-W37                                      customer

1702829476     2015-W38                                      customer

1702829476     2015-W39                                      customer

1 REPLY
Junior Contributor

Re: Ordered Analytical Function/Iterative Loop

What's your TD release?

In TD14 you could use FIRST_VALUE/LAST_VALUE:

SELECT party_id,  fisc_week_val, lifecycle_stage,
COALESCE(LAST_VALUE(lifecycle_stage IGNORE NULLS)
OVER (ORDER BY fisc_week_val
ROWS UNBOUNDED PRECEDING),
FIRST_VALUE(lifecycle_stage IGNORE NULLS)
OVER (ORDER BY fisc_week_val
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
)
FROM tab

Before this should work, too:

SELECT party_id, fisc_week_val, lifecycle_stage,
MAX(lifecycle_stage)
OVER (PARTITION BY CASE WHEN grp = 0 THEN 1 ELSE grp end)
FROM
(
SELECT party_id, fisc_week_val, lifecycle_stage,
SUM(CASE WHEN lifecycle_stage IS NULL THEN 0 ELSE 1 END)
OVER(ORDER BY fisc_week_val
ROWS UNBOUNDED PRECEDING ) AS grp
FROM tab
) AS dt