【发布时间】:2011-09-25 13:36:45
【问题描述】:
我有一个 SQLite 数据库,我需要执行以下操作:只保留最后 N 条记录,按日期排序。你是怎么做到的?
【问题讨论】:
-
需要列,如果有的话是自动增量的...
标签: sql sqlite sql-delete
我有一个 SQLite 数据库,我需要执行以下操作:只保留最后 N 条记录,按日期排序。你是怎么做到的?
【问题讨论】:
标签: sql sqlite sql-delete
我想知道这是否比 Jackob 解决方案更快或更慢。 sqlitebrowser 说两者都是 0ms...
DELETE FROM test WHERE date < ( SELECT date FROM test ORDER BY date DESC LIMIT 1 OFFSET 9 )
【讨论】:
假设您有一个 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 替换为您的时间戳列)
【讨论】:
要仅保留最后 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) );
让我知道它是如何为你工作的!
【讨论】:
如果 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
【讨论】:
删除除最新的 10 条记录之外的所有记录。
delete
from test
where id not in (
select id
from test
order by date desc
limit 10
)
【讨论】: