【发布时间】:2021-08-01 16:46:03
【问题描述】:
我想选择所有在 2020 年 12 月状态更改为 B1 的帐户。即现在具有 B1 状态的帐户和之前的记录中没有的帐户。 VALID_TO_DATE = 31/12/2100 (DD/MM/YYYY) 的记录是最近的记录。
但是,在某些情况下,例如帐户 400,状态更改发生在倒数第二条记录中,该记录不再有效。但是由于更改发生在 12 月,并且状态与有效记录相同,因此我的选择语句必须包含帐户 400。
期望的结果:从这个意义上说,根据下面的数据,我需要一个只返回账户100和400
的select| 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 |
我的源表记录了影响每个帐户的所有更改,这些更改可能会也可能不会更改相应帐户的状态。
这是我不完整/错误的尝试:
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);
【问题讨论】:
-
哪个数据库? MySQL 5.x? MySQL 8?甲骨文18c? SQL Server 2019?等等等等
-
如果 12 月的第一条记录是 B1,但在 11 月以 A1 结束怎么办?另外,您的日期列是字符串还是某种日期/时间/时间戳数据类型? (我强烈建议对文字日期值使用 ISO 数据格式,例如
'2020-12-01')
标签: sql select subquery relational-database where-clause