是否有一种方法来停止sqlite3 total()早期超过一定的值?



我有这个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

,因为它重新计算每行的总和,而不是仅仅将下一行的大小添加到运行总数中。

相关内容

最新更新