如何编写 LEAD 函数以在 Type 发生变化时获取下一条记录的值。
源数据
Person Type dt_eff
123 ABC 2018-10-23
123 DEF 2018-12-19
124 ABC 2020-01-01
124 ABC 2020-02-15
124 ABC 2020-05-14
124 DEF 2020-10-13
124 FGD 2021-01-15
预期产出
Person Type Start_date End_Date
123 ABC 2018-10-23 2018-12-19
123 DEF 2018-12-19 NULL
124 ABC 2020-01-01 2020-10-13
124 ABC 2020-02-15 2020-10-13
124 ABC 2020-05-14 2020-10-13
124 DEF 2020-10-13 2021-01-15
124 FGD 2021-01-15 NULL
下面的查询仅给出下一列值,但需要类型更改时记录的值。
SELECT Person, Type, dt_eff as start_date,
LEAD(dt_eff,1) over (partition by person order by dt_eff) as end_Date
FROM Person
您停止得太早了,在获取
lead
值后,您需要获取 max
分区上的 Person, Type
值,例如
with cte as (
select *
, lead(dt_eff) over (partition by Person order by Type, dt_eff) dt_eff_lead
from Person
)
select Person, Type, dt_eff StartDate
, max(dt_eff_lead) over (partition by Person, Type) EndDate
from cte
order by Person, Type, dt_eff;
按要求退货:
人 | 类型 | 开始日期 | 结束日期 |
---|---|---|---|
123 | ABC | 2018-10-23 | 2018-12-19 |
123 | 防御 | 2018-12-19 | 空 |
124 | ABC | 2020-01-01 | 2020-10-13 |
124 | ABC | 2020-02-15 | 2020-10-13 |
124 | ABC | 2020-05-14 | 2020-10-13 |
124 | 防御 | 2020-10-13 | 2021-01-15 |
124 | 烟气脱硫 | 2021-01-15 | 空 |