首页 > 解决方案 > 在 SQL 中选择更改值的开始和结束日期

问题描述

我有一个包含帐户和历史状态更改的数据库

从历史代码中选择日期、帐户、OldStatus、NewStatus 按帐户、日期排序

日期 帐户 旧状态 新状态
2020-01-01 12345 1 2
2020-10-01 12345 2 3
2020-11-01 12345 3 2
2020-12-01 12345 2 1
2020-01-01 54321 2 3
2020-09-01 54321 3 2
2020-12-01 54321 2 3

对于每个帐户,当状态 = 2 时,我需要确定开始日期和结束日期。另一个挑战是状态可以多次来回更改。SQL 中有没有办法在帐户位于 2 时至少在前两个时间范围内创建类似的东西?有任何想法吗?

帐户 开始Dt_1 EndDt_1 开始Dt_2 EndDt_2
12345 2020-01-01 2020-10-01 2020-11-01 2020-12-01
54321 2020-09-01 2020-12-01

标签: sqlgaps-and-islands

解决方案


我建议将此信息放在单独的行中:

select t.*
from (select account, date as startdate,
             lead(date) over (partition by account order by date) as enddate
      from t
     ) t
where newstatus = 2;

当帐户的状态为 时,这将为每个期间生成单独的行2。这比将日期放在单独的列对中要好,因为您在编写查询时不需要知道状态 = 2 的最大周期数。


推荐阅读