我如何 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';
演示在 SQL 服务器中,但基本代码应该 运行 在任何支持 ROW_NUMBER
的数据库上。
我有一个历史记录 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';
演示在 SQL 服务器中,但基本代码应该 运行 在任何支持 ROW_NUMBER
的数据库上。