访问SQL查询以删除除最后一个最长日期以外的所有符合条件的日期
我有一个带有登录名和日期的表,我只想为每个记录保留最后N个连接,每个记录都有一个特殊的外部id 例如:我想在我的表中保留最后2个连接(每个idexternal的2个最新日期),因此我希望使用最好的delete查询来实现这一点(除了“where not in”还有其他方法吗?)。我的桌子里有几百万张唱片 表:登录访问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
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”但我想知道它是否有效,因为我有数百万条记录。这是“视情况而定”的事情之一。最好的办法是尝试查询,看看它是否在满足您特定需求的合理时间范围内运行。