I have the following table and I’d like to get the antepenultimate or the value before the previous value.
I already have group
, value
and prev_value
, dateint
… I’m trying to derive prev_prev_value
x
grp value prev_value prev_prev_value dateint
-----------------------------------------------------------
1 x null null 20200101
1 x null null 20200102
2 y x null 20200103
2 y x null 20200104
2 y x null 20200105
3 z y x 20200106
3 z y x 20200107
3 z y x 20200108
4 a z y 20200109
This is the table with test data (as a CTE)
with test as (
select 1 as grp, 'x' as value , null as prev_value , 20200101 as dateint
union
select 1 as grp, 'x' as value , null as prev_value , 20200102 as dateint
union
select 2 as grp, 'y' as value , 'x' as prev_value , 20200103 as dateint
union
select 2 as grp, 'y' as value , 'x' as prev_value , 20200104 as dateint
union
select 2 as grp, 'y' as value , 'x' as prev_value , 20200105 as dateint
union
select 3 as grp, 'z' as value , 'y' as prev_value , 20200106 as dateint
union
select 3 as grp, 'z' as value , 'y' as prev_value , 20200107 as dateint
union
select 3 as grp, 'z' as value , 'y' as prev_value , 20200108 as dateint
union
select 4 as grp, 'a' as value , 'z' as prev_value , 20200109 as dateint
)
Any ideas on how to derive prev_prev_value
I’d like to use window functions and avoid joins.
I’ve tried LAG
but I have not been successful.
Advertisement
Answer
It appears that a nested FIRST(LAG..
did the job:
The logic behind that was to get the previous (lag) prev_value
and get the FIRST value of that group
select grp,
value,
prev_value,
FIRST(LAG(prev_value) over (order by dateint)) over (partition by grp order by dateint) as prev_prev_value,
dateint
from test order by dateint