我有下表,我想获得前倒数或前一个值之前的值。
我已经有group
,value
和prev_value
,dateint
...我试图派生prev_prev_value
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
这是带有测试数据的表格(作为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
)
关于如何派生prev_prev_value
的任何想法,我想使用窗口函数并避免联接。
我尝试过LAG
,但没有成功。
似乎嵌套FIRST(LAG..
完成了该工作:
其背后的逻辑是获取前一个(滞后)prev_value
并获取该组的第一个值
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
使用窗框:
select t.*,
LAST_VALUE(prev_value) OVER (ORDER BY dateint
RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
) as prev_prev_value
from test t
order by dateint ;