Sql 如果没有信息,如何从下一行获取信息并填写?

Sql 如果没有信息,如何从下一行获取信息并填写?,sql,postgresql,date,select,window-functions,Sql,Postgresql,Date,Select,Window Functions,因此,我有下表: 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 我想做的是从下一行获取日期,如果我找不到该日期,那么我将填写账单日期+60天。当然,所有这些都基于Id。我的数据最终应该是这样的: Id Billing_Date Bill

因此,我有下表:

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 
我想做的是从下一行获取日期,如果我找不到该日期,那么我将填写账单日期+60天。当然,所有这些都基于Id。我的数据最终应该是这样的:

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结合使用

我原以为这样行得通,但没有:

select Id, Billing_Date, 
    lead(Billing_Date) over (order by Id) as Billing_Date_Duo
您可以在正确的分区(
id
)和
orderby
上使用
lead()
,以及
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()
,来缩短这个过程:

您可以在正确的分区(
id
)上使用
lead()
)和
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()
,来缩短这个过程: