假设我们有如下数据:
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
我想对这个表进行变换,使Obsolete
的low_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
演示