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
子句,以处理每个帐户的更多可能范围。
我有一个包含帐户和历史状态更改的数据库
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
子句,以处理每个帐户的更多可能范围。