【问题标题】:Access SQL query to delete all but last max date with criteria访问 SQL 查询以使用条件删除除最后一个最大日期之外的所有日期
【发布时间】:2019-09-27 01:42:23
【问题描述】:

我有一个带有登录名和日期的表,我只想为每个具有特殊外部 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 查询来做到这一点?

谢谢

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

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

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

    【讨论】:

    • 这是列出我想要保留的内容的查询...很好(除了 2 的括号),但我希望删除查询检索其他记录(所以我会保留这些结果在我的桌子上^^)
    • 我想我可以添加“NOT in”来完成这项工作,但我想知道它是否有效,因为我有几百万条记录
    • 这是“取决于”的事情之一。最好的办法是尝试查询,看看它是否在满足您特定需求的合理时间范围内运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2021-01-25
    • 2020-04-18
    • 2019-05-25
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多