【问题标题】:Keep only N last records in SQLite database, sorted by date在 SQLite 数据库中只保留最后 N 条记录,按日期排序
【发布时间】:2011-09-25 13:36:45
【问题描述】:

我有一个 SQLite 数据库,我需要执行以下操作:只保留最后 N 条记录,按日期排序。你是怎么做到的?

【问题讨论】:

标签: sql sqlite sql-delete


【解决方案1】:

我想知道这是否比 Jackob 解决方案更快或更慢。 sqlitebrowser 说两者都是 0ms...

DELETE FROM test WHERE date < ( SELECT date FROM test ORDER BY date DESC LIMIT 1 OFFSET 9 )

【讨论】:

    【解决方案2】:

    假设您有一个 id 列,它是一个序列号 (AUTO INCREMENT),您可以使用以下内容:

    DELETE FROM table_name
    WHERE id < (
        SELECT MIN(id)
        FROM (SELECT id
              FROM table_name
              ORDER BY id DESC
              LIMIT num_of_records_to_keep))
    

    使用时间戳列时可以使用相同的查询(只需将 id 替换为您的时间戳列)

    【讨论】:

      【解决方案3】:

      要仅保留最后 10 条记录,请考虑倒置。

      要删除旧的 10 条记录:

      DELETE FROM Table_name 
      WHERE date in (SELECT date FROM Table_name ORDER BY Date Desc Limit -1 
                     OFFSET  (select count(*)-10 from Table_name) );
      

      让我知道它是如何为你工作的!

      【讨论】:

        【解决方案4】:

        根据SQLite documentation

        如果 SQLite 是使用 SQLITE_ENABLE_UPDATE_DELETE_LIMIT 编译时选项编译的,则 DELETE 语句的语法会通过添加可选的 ORDER BY 和 LIMIT 子句来扩展。

        (...)

        如果 DELETE 语句有 ORDER BY 子句,则在没有 LIMIT 子句的情况下将删除的所有行都根据 ORDER BY 排序。前 M 行(其中 M 是通过计算 OFFSET 子句表达式找到的值)被跳过,随后的 N 行(其中 N 是 LIMIT 表达式的值)被删除。如果在考虑 OFFSET 子句后剩余的行数少于 N,或者如果 LIMIT 子句的计算结果为负值,则删除所有剩余的行。

        这将允许您编写:

        DELETE FROM table WHERE expr ORDER BY date DESC LIMIT -1 OFFSET 10
        

        【讨论】:

        • ~"如果剩余的行数少于 N"。 -1 在这里是什么意思?
        • @IgorGanapolsky 看引用段落的最后一句话:如果 LIMIT 子句评估为负值,则删除所有剩余行
        • 那么如果表中的行数少于10行,则全部删除?
        • @IgorGanapolsky 如果表中总共少于 10 行,则不会删除任何行。
        • @VladimirCh 也许是因为这个问题是针对 SQLite,而不是针对 mariaDB。
        【解决方案5】:

        删除除最新的 10 条记录之外的所有记录。

        delete
        from test
        where id not in (
            select id
            from test
            order by date desc
            limit 10
        )
        

        【讨论】:

        • 谢谢。但是我怎么知道我需要删除多少条记录呢?
        • 你不这样做,该查询会删除除最新的 10 条记录之外的所有记录
        • 谢谢,它成功了。虽然你的 sql 语句不需要 *
        • 不是“...order by date desc limit 10”吗?
        • 我尝试了这个精确的查询(剪切和粘贴)并返回了一个错误。然后我尝试在“按日期排序”之后加上“desc”(正如@Drejc 所建议的那样),它奏效了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-23
        • 2020-04-05
        • 2012-01-18
        • 1970-01-01
        • 2015-02-18
        相关资源
        最近更新 更多