Select SQL 中更改值的开始和结束日期

Select start and end dates for changing values in SQL

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

select HistoricalCodes 中的日期、帐户、旧状态、新状态 按帐户、日期排序

Date Account 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

对于每个帐户,当 Status = 2 时,我需要确定 Start Date 和 End Date。另一个挑战是状态可以多次来回更改。 SQL 中是否有一种方法可以在帐户处于 2 时至少在前两个时间范围内创建类似的内容?有什么想法吗?

Account StartDt_1 EndDt_1 StartDt_2 EndDt_2
12345 2020-01-01 2020-10-01 2020-11-01 2020-12-01
54321 2020-09-01 2020-12-01

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

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 时,这会为每个期间生成一个单独的行。这比将日期放在单独的成对列中要好,因为您在编写查询时不需要知道 status = 2 的最大周期数。

对于每个帐户的固定最大状态更改,您可以使用 window 函数和条件聚合:

select account,
    max(case when rn = 1 then      date end) as start_dt1,
    max(case when rn = 1 then lead_date end) as end_dt1,
    max(case when rn = 2 then      date end) as start_dt2,
    max(case when rn = 2 then lead_date end) as end_dt2
from (
    select t.*, 
        row_number() over(partition by account, newstatus order by date) as rn,
        lead(date) over(partition by account order by date) as lead_date
    from mytable t
) t
where newstatus = 2
group by account

您可以使用更多条件表达式扩展 select 子句,以处理每个帐户的更多可能范围。