【问题标题】:sqlite query - select all older than X days, not Y newestsqlite 查询 - 选择所有早于 X 天的,而不是 Y 最新的
【发布时间】: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


【解决方案1】:

试试这个。我已将您的表格重命名为 t

DELETE FROM t WHERE rowid IN(
  SELECT a.rowid FROM t a
  WHERE time < 14362685399
  AND a.rowid NOT IN (
    SELECT b.rowid FROM t b
    WHERE a.type = b.type
    ORDER BY b.time DESC
    LIMIT 5
  )
);

请注意,这对大数据可能不是很有效,因为每次需要时都会评估correlated subquery(可能在您的表中每个不同的type 一次,或者甚至可能在表中的每行一次)表,具体取决于查询的执行方式)。

顺便说一句,在支持它的 SQL 变体中,使用窗口函数可能会更好地实现这一点。例如,在Postgres

【讨论】:

  • 谢谢,就是这样,最后很简单:-) 当然这样的子查询可能会很慢。如果性能很差,我将不得不对每个插入进行检查,仅针对插入的行或类似的东西......我们会看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2013-12-19
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
相关资源
最近更新 更多