访问SQL查询以删除除最后一个最长日期以外的所有符合条件的日期

访问SQL查询以删除除最后一个最长日期以外的所有符合条件的日期,sql,ms-access,Sql,Ms Access,我有一个带有登录名和日期的表,我只想为每个记录保留最后N个连接,每个记录都有一个特殊的外部id 例如:我想在我的表中保留最后2个连接(每个idexternal的2个最新日期),因此我希望使用最好的delete查询来实现这一点(除了“where not in”还有其他方法吗?)。我的桌子里有几百万张唱片 表:登录 id, idExternal, DateLogin 1, 1, 2019/09/20 -> DELETE 2, 1, 2019/09/21

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

例如:我想在我的表中保留最后2个连接(每个idexternal的2个最新日期),因此我希望使用最好的delete查询来实现这一点(除了“where not in”还有其他方法吗?)。我的桌子里有几百万张唱片

表:登录

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查询才能做到这一点


谢谢

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

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 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)
上的索引将有助于此查询。但是,如果您必须删除很多行,查询将效率低下。通常最好只创建一个包含所需行的新表,截断旧表,然后重新插入值。

这是一个列出我要保留的内容的查询…很好(除了括号中的2),但我希望删除查询检索其他记录(因此我将这些结果保留在我的表中^^),我想我可以添加“NOT in”但我想知道它是否有效,因为我有数百万条记录。这是“视情况而定”的事情之一。最好的办法是尝试查询,看看它是否在满足您特定需求的合理时间范围内运行。