通过postgres中的窗口抓取另一个列值



假设我们有如下数据:

id type    low_date upper_date
1 Obsolete 2020-01-01 null
1 Ext      2019-01-01 null
2 Obsolete 2023-01-01 null
2 Ext      2018-01-01 null

我想对这个表进行变换,使Obsoletelow_date作为Ext各自的ids的上日期。

预期的结果:

id type    low_date upper_date
1 Obsolete 2020-01-01 null
1 Ext      2019-01-01 2020-01-01
2 Obsolete 2023-01-01 null
2 Ext      2018-01-01 2023-01-01

您可以使用窗口函数LAG()来实现,该函数获取特定列的前一行值。

select id, type, low_date, lag(low_date) over (partition by id order by low_date desc) as upper_date
from mytable

这是使用LEFT JOIN的另一种方式:

select t.id, t.type, t.low_date, s.low_date
from mytable t
left join (
select id, type, low_date
from mytable
where type = 'Obsolete'
) as s on s.id = t.id and s.type <> t.type

演示