首页 > 解决方案 > 访问 SQL 查询以使用条件删除除最后一个最大日期之外的所有日期

问题描述

我有一个带有登录名和日期的表,我只想为每个具有特殊外部 ID 的记录保留最后 N 个连接

例如:我想在我的表中保留最后 2 个连接(每个 idexternal 的 2 个最新日期),所以我想要最好的删除查询来做到这一点(除了“不在哪里”之外,还有其他方法吗?)。我的表中有几百万条记录...

表:登录

id, idExternal, DateLogin
 1,          1, 2019/09/20 -> DELETE 
 2,          1, 2019/09/21 -> DELETE
 3,          1, 2019/09/22 -> KEEP
 4,          1, 2019/09/23 -> KEEP
 5,          2, 2019/09/20 -> DELETE 
 6,          2, 2019/09/21 -> DELETE
 7,          2, 2019/09/22 -> KEEP
 8,          2, 2019/09/24 -> KEEP
 9,          3, 2019/09/23 -> DELETE
10,          3, 2019/09/24 -> KEEP
11,          3, 2019/09/25 -> KEEP
12,          4, 2019/09/22 -> KEEP

如何仅使用 sql 查询来做到这一点?

谢谢

标签: sqlms-access

解决方案


您可以使用相关子查询。这是一种方法:

select t.*
from t
where t.datelogin in (select top (2) t2.datelogin
                      from t as t2
                      where t2.idExternal = t.idExternal
                      order by t2.datelogin desc
                     );

对于一个delete

delete from t
    where t.datelogin not in (select top (2) t2.datelogin
                              from t as t2
                              where t2.idExternal = t.idExternal
                              order by t2.datelogin desc
                             );

上的索引(idExternal, datelogin)将有助于此查询。但是,如果您必须删除很多行,则查询效率会很低。通常最好创建一个只包含所需行的表,截断旧表并重新插入值。


推荐阅读