我如何 select 从历史 table 中删除未删除的记录?

How do I select non-deleted records from a history table?

我有一个历史记录 table table 我保存所有记录,无论它们是插入、更新还是删除。我只想 select 按照下面的例子的最新记录。 例如,下面是两个事务 23 和 24。我想选择 23 的最新更新并想跳过 24,因为它在最后被删除。请帮我写一个查询。

Source:

Transaction  Flag   Date        
23            I    1/1/2020     
23            U    2/1/2020         I-Inserted
23            U    3/1/2020         U-Updated
23            U    4/1/2020         D-Deleted
24            I    1/1/2020     
24            U    2/1/2020     
24            D    3/1/2020     


Result:

Transaction  Flag      Date     
23            U    4/1/2020     

一种方法使用相关子查询:

select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.transaction = t.transaction) and
      t.flag <> 'D';

不知道你用的是MySQL还是SQL服务器,假设是MySQL8+或者SQL服务器,这里是一个版本工作:

SELECT "Transaction", Flag, Date
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY "Transaction" ORDER BY Date DESC) rn
    FROM yourTable
) t
WHERE rn = 1 AND Flag <> 'D';

Demo

演示在 SQL 服务器中,但基本代码应该 运行 在任何支持 ROW_NUMBER 的数据库上。