【问题标题】:Select that returns only new status changes选择仅返回新的状态更改
【发布时间】: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


【解决方案1】:

我想选择在 2020 年 12 月期间状态更改为 B1 的所有帐户。

使用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'

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2012-08-17
    • 1970-01-01
    • 2015-11-20
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多