SQL - Получить антепенультимат (до предыдущей группы / фазы) - PullRequest
1 голос
/ 13 марта 2020

У меня есть следующая таблица, и я хотел бы получить antepenultimate или значение до предыдущего значения.

У меня уже есть 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, но не добился успеха.

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Похоже, что вложенный FIRST(LAG.. выполнил задание:

Лог c, который должен был получить предыдущий (лаг) 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 голосов
/ 13 марта 2020

Используйте оконную раму:

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 ;
...