【发布时间】:2015-07-07 12:26:39
【问题描述】:
我的 sqlite 表具有以下格式(例如所有非空且非唯一 INTEGER):
time type data
1436268660 0 ...
1436268661 1 ...
1436268662 0 ...
1436268666 2 ...
1436268668 1 ...
有时我需要删除每种类型的所有早于某个时间的行,但我需要从每种类型中保留 5 个最新的行,即使它们早于特定时间。 换句话说,保留每种类型的 5 个最新行,并且都比指定时间更新(如果超过 5 个)并删除其余的。
所以,如果指定的时间是 X 并且类型 0 有 20 行比 X 新,则类型 0 什么也不做(所有都足够新)。 此外,如果指定时间是 X 并且类型 0 有 5 行都比 X 早,则什么也不做(其中不超过 5 个)。 但是如果有例如 7 个条目并且其中至少 2 个比 X 更旧,那么那些最旧的 2 个将被删除。
到目前为止,我所拥有的是这个查询。但这是不正确的。当该类型超过 5 个时,它只会删除所有早于 X 的行。如果它们都比 X 旧,则什么都没有。
DELETE FROM table WHERE rowid IN
(SELECT table.rowid FROM table JOIN
(SELECT type FROM table GROUP BY type HAVING COUNT(*) > 5)
USING (type) WHERE TIME < 14362685399);
正如你所看到的情况有点复杂,因为我上面描述的“类型”实际上是多列的唯一组合(你可以用 type1,type2,type3 替换),但我想这不是那么重要为解决方案。 感谢您的帮助。
time type0 type1 type2 data
1436268660 0 0 0 ...
1436268661 1 1 1 ...
1436268662 0 0 0 ...
1436268666 2 2 2 ...
1436268668 1 1 1 ...
编辑:基本上我需要删除所有不在的行:(比 X 新)UNION(每种类型 5 个最新条目)。 我只是不知道如何使用“每种类型 5 个最新条目”来创建结果。
【问题讨论】:
-
表定义是什么(例如时间的列类型)
-
TIME 是 DATETIME 类型,但我猜它可能只是我搜索“大于”、“小于”的整数数字。 TYPE 列是整数,其余的可能并不重要。
-
一切都不是空的,一切都不是唯一的
-
考虑用附加信息编辑问题
-
INTEGER not null 不是添加的唯一类型信息
标签: sqlite