Как мне получить информацию из следующей строки и заполнить ее, если информации нет? - PullRequest
0 голосов
/ 19 июня 2020

Итак, у меня есть следующая таблица:

Id     Billing_Date
A00    2020-01-01
A00    2020-02-01
A00    2020-04-01
B91    2020-01-01
B91    2020-03-01
B91    2020-04-01
C11    2020-01-01 

Я хочу получить дату из следующей строки, и если я не найду эту дату, то заполню Billing_Date + 60 дн. Все, конечно, на основе идентификатора. Вот как в итоге должны выглядеть мои данные:

Id     Billing_Date    Billing_Date_Duo
A00    2020-01-01      2020-02-01
A00    2020-02-01      2020-04-01
A00    2020-04-01      2020-06-01
B91    2020-01-01      2020-03-01
B91    2020-03-01      2020-04-01
B91    2020-04-01      2020-06-01
C11    2020-01-01      2020-03-01

Как я могу это сделать? Я знаю, что должен использовать что-то вроде lead () , но не знаю, как это сделать здесь и как сочетать с case when.

Я думал, что это сработает, но не :

select Id, Billing_Date, 
    lead(Billing_Date) over (order by Id) as Billing_Date_Duo

1 Ответ

2 голосов
/ 19 июня 2020

Вы можете использовать lead() над правильным разделом (id) и order by и coalesce(), чтобы назначить значение по умолчанию:

select
    id,
    billing_date,
    coalesce(
        lead(billing_date) over(partition by id order by billing_date),
        billing_date + interval '60 day'
    ) billing_date_duo
from mytable

Вы можете сократить это с помощью 3- аргумент формы lag():

select
    id,
    billing_date,
    lead(billing_date, 1, (billing_date + interval '60 day')::date) 
        over(partition by id order by billing_date) billing_date_duo
from mytable

Демо на DB Fiddle

...