sql - 访问 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 查询来做到这一点?
谢谢
解决方案
您可以使用相关子查询。这是一种方法:
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)
将有助于此查询。但是,如果您必须删除很多行,则查询效率会很低。通常最好创建一个只包含所需行的新表,截断旧表并重新插入值。
推荐阅读
- unix - oc rsync 由于 /tmp 存储中的磁盘空间不足而失败
- windows - Windows Batch:如何使用 GET 返回值仅将有效的软件下载链接附加到文本文件?
- vimdiff - 如何让 vimdiff 同时应用 REMOTE 和 LOCAL 更改?
- angular - 我只想在该 id 有如下值时才显示动态表单?我该如何处理它?
- vba - 刷新后台查询的运行时错误 1004
- string - 颤振 | 如何检查字符串是否不包含子字符串或字符
- unix - 如何从文件中删除与字符串匹配的行
- deep-learning - PermissionError 在加载 pytorch 模型期间
- python - 安装sickits.audiolab 时出错
- python - Pandas to_sql - 传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确