我有这个sample
表:
NAME SIZE
sam 100
skr 200
sss 50
thu 150
我想做这个查询:
select total(size) > 300 from sample;
但是我的表非常大,所以我希望它在total(size)
已经大于300时提前停止计算,而不是遍历整个表。(我的表格中没有负的大小。)在SQLite中有什么办法做到这一点吗?
我已经找到了一种方法,让它尽早停止,通过使用窗口函数,但是不幸的是,由于不同的原因使它变慢。我希望其他人有更快的方法。要真正加快速度,您可能需要创建一个自定义聚合函数。
窗口函数方法
一个正常的聚合函数,如total()
将总是添加所有的行,但你可以使用一个聚合窗口函数,而不是只添加一些行:
select name, size,
total(size) over (rows between unbounded preceding
and current row)
from sample
会给你
sam|100|100.0
skr|200|300.0
sss|50|350.0
thu|150|500.0
,其中第三列是累加和。在这个结果中可以看到,一旦看到350
,您希望停止这个查询。可以通过将上述查询放入子查询并使用EXISTS
操作符来实现:
select exists(
select 1
from (select total(size) over (rows between unbounded preceding
and current row)
as total_size
from sample)
where total_size > 300)
这将只过滤查询到>300,然后停止并返回true
(1
),只要它找到其中一个。如果没有找到符合该和的行,则返回false
(0
)。
然而:这个版本可能比简单的
要长select total(size) > 300 from sample
,因为它重新计算每行的总和,而不是仅仅将下一行的大小添加到运行总数中。