SQL-获得倒数第二个(在先前的组/阶段之前)

问题描述 投票:0回答:2

我有下表,我想获得前倒数或前一个值之前的值。

我已经有groupvalueprev_valuedateint ...我试图派生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,但没有成功。

sql apache-spark-sql
2个回答
0
投票

似乎嵌套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 

0
投票

使用窗框:

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 ;
© www.soinside.com 2019 - 2024. All rights reserved.