例如我有:
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或其他内容)。我只是好奇如果没有嵌套选择可以做到这一点吗?
答案 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顺序存储。