代码之家  ›  专栏  ›  技术社区  ›  rytis

高效的SQL计算最近X行中的事件数

  •  1
  • rytis  · 技术社区  · 15 年前

    例如,我有:

    create table a (i int);
    

    假设有10000行。

    我想数最后20行的0。

    比如:

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

    有没有可能提高效率?像一个SQL语句之类的?

    PS.DB是sqlite3,如果这很重要…

    更新

    PPS。在这种情况下,不需要按任何内容进行分组,假设表实际上是1列(并且可能是内部DB行_ID或其他内容)。我只是好奇,如果没有嵌套的选择,这是否可行?

    4 回复  |  直到 15 年前
        1
  •  1
  •   newtover    15 年前

    如果不从表中删除行,可以尝试以下黑客查询:

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

    它只使用rowids。作为 documentation 说:行按rowid顺序存储。

        2
  •  2
  •   D'Arcy Rittich    15 年前

    为了确定最后20行,您需要按某些内容排序。当你说 最后的 你是说日期,身份证…

    这样的方法应该有效:

    select count(*) 
    from (
        select i 
        from a 
        order by j desc
        limit 20
    ) where i = 0; 
    
        3
  •  1
  •   Mark Byers    15 年前

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

    为了提高效率,您应该确保排序依据的列上有一个索引,甚至可能有一个聚集索引。

        4
  •  1
  •   maid450    15 年前

    恐怕您需要一个嵌套的select来一次计算和限制最后x行,因为类似这样的事情

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

    将计数0,但在所有表记录中,因为此查询中的限制基本上不起作用。

    但是,您可以优化制作 COUNT(i) 由于只计算一个字段比2个或更多字段更快(在这种情况下,您的表将有2个字段i和rowid,它们是由sqlite在无pkless表中自动创建的)

    推荐文章