限制

2010-10-24 24 views
1

比方說,我有一個這樣的表(由id訂購):限制

id amount 
--- --- 
1  10 
2  15 
3  10 
4  30 

我想查詢將返回行,使得amount總和大於給定數量較大。因此(在不存在的語法中)SELECT id, amount LIMIT BY running_total(amount) 20選擇前2行,... LIMIT BY running_total(amount) 60選擇所有行。我無法更改模式以保持預先計算的運行總數。這可以合理有效地完成嗎?如果答案只適用於SQLite,那將是可以接受的。

回答

1

你可以使用求和以較低的ID的所有行的子查詢:

select * 
from YourTable t1 
where 20 > coalesce(
     (
     select sum(amount) 
     from YourTable t2 
     where t2.id < t1.id 
     ), 0) 

聚結是捕獲的第一行,其中有null的總和。

+0

這會有二次行爲,還是SQL引擎足夠智能來優化它? – 2010-10-25 06:34:06

+0

@Alexey Romanov:不確定你的意思是二次的,如果你知道一種方法來看看SqlLite的查詢計劃讓我知道:) – Andomar 2010-10-25 09:39:40

+0

第一行的子查詢需要查看0行,第二行:1行,然後是2, 3等。如果第N行是正確的,我們必須看0 + 1 + 2 + ... +(N-1)= N *(N-1)/ 2行。但似乎很清楚,我們只需要看N行。 – 2010-10-25 14:10:00