高效的SQL来计算最新X行中的事件

时间:2010-04-20 20:36:27

标签: sql optimization sqlite

例如我有:

create table a (i int);

假设有10k行。

我想在最后20行计算0。

类似的东西:

select count(*) from (select i from a limit 20) where i = 0;

是否可以提高效率?像一个SQL语句或什么?

PS。 DB是SQLite3,如果这一点很重要......

更新

PPS。在这种情况下,不需要按任何内容进行分组,假设表格实际上是1列(可能是内部数据库row_ID或其他内容)。我只是好奇如果没有嵌套选择可以做到这一点吗?

4 个答案:

答案 0 :(得分:2)

您需要按某种顺序排序才能确定最后20行。当你说 last 时,你的意思是按日期,按ID,......?

这样的事情应该有效:

select count(*) 
from (
    select i 
    from a 
    order by j desc
    limit 20
) where i = 0; 

答案 1 :(得分:1)

您需要记住在使用限制时按顺序排序,否则结果是不确定的。要添加最新的行,您需要包含一个包含插入日期的列,然后您可以使用它。如果没有此列,则无法保证您将获得最新的行。

为了提高效率,您应该确保您订购的列上有索引,甚至可能是聚集索引。

答案 2 :(得分:1)

我担心你需要一个嵌套的选择,以便能够计算和限制一次最后X行,因为像这样的事情

SELECT count(*) FROM a GROUP BY i HAVING i = 0

将计数0,但在所有表记录中,因为此查询中的LIMIT基本上没有效果。

但是,您可以优化制作COUNT(i),因为COUNT只有一个字段比2个或更多更快(在这种情况下,您的表将有2个字段,i和rowid,由SQLite在PKless中自动创建表)

答案 3 :(得分:1)

如果您不从表中删除行,则可以尝试以下hacky查询:

SELECT COUNT(*) as cnt
FROM A
WHERE
    ROWID > (SELECT MAX(ROWID)-20 FROM A)
    AND i=0;

仅适用于ROWID。正如documentation所说:行以rowid顺序存储。