Select returns 只有新的状态变化

Select that returns only new status changes

我想select所有在2020年12月状态变为B1状态的账户。即现在有B1状态而之前记录中没有的账户。 VALID_TO_DATE = 31/12/2100 (DD/MM/YYYY) 的记录是最近的记录。

但是也有一些情况,比如账号400,状态变化发生在倒数第二条记录,不再有效。但是因为是12月份的变化,状态和有效记录一样,所以我的select statement 必须包含account 400.

期望的结果: 从这个意义上说,根据下面的数据,我需要一个 select 而 returns 只需要 100和 400

ROW ACCOUNT_ID ACCOUNT_CHANGE_DATE VALID_TO_DATE ACCOUNT_STATUS
1 100 21/10/2020 05/12/2020 A1
2 100 05/12/2020 15/12/2020 A1
3 100 15/12/2020 31/12/2100 B1
4 200 09/11/2020 22/12/2020 A1
5 200 22/12/2020 25/12/2020 A1
6 200 25/12/2020 31/12/2100 A1
7 300 11/11/2020 19/11/2020 B1
8 300 19/11/2020 23/12/2020 A1
9 300 23/12/2020 31/12/2100 A1
10 400 16/11/2020 14/12/2020 A1
11 400 14/12/2020 18/12/2020 B1
12 400 18/12/2020 31/12/2100 B1

我的消息来源 table 记录了影响每个帐户的所有更改,这些更改可能会或可能不会更改相应帐户的状态。

这是我的 incomplete/wrong 尝试:

SELECT ACCOUNT_ID
FROM TABLE t1
where ACCOUNT_STATUS ="B1"
      AND ACCOUNT_CHANGE_DATE BETWEEN '01/12/2020' AND '31/12/2020' 
      AND VALID_TO_DATE = '31/12/2100'
      AND NOT EXISTS (SELECT * FROM TABLE t2
                      WHERE t2.ACCOUNT_ID = t1.ACCOUNT_ID 
                            AND t2.ACCOUNT_STATUS = 'B1' 
                            AND t2.ACCOUNT_CHANGE_DATE < t1.ACCOUNT_CHANGE_DATE);

I would like to select all the accounts that status changed to B1 during the month of December 2020.

使用lag():

select t1.*
from (select t1.*,
             lag(status) over (partition by account_id order by ACCOUNT_CHANGE_DATE) as prev_status
      from t1
     ) t1
where prev_status <> 'B1' and status = 'B1' and
      account_change_date >= '2021-12-01' and
      account_change_date < '2022-01-01'