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'
我想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'