Lead 函数在列值发生变化时取值

问题描述 投票:0回答:1

如何编写 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
sql sql-server t-sql sql-server-2012 sql-server-2019
1个回答
0
投票

您停止得太早了,在获取

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

DBFiddle

© www.soinside.com 2019 - 2024. All rights reserved.