2010-10-24 5 views
1

Disons que j'ai une table comme celui-ci (ordonnée par id):Limite en courant total SQLite

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

Je veux une requête qui renvoie des lignes telles que la somme de amount est supérieur à un nombre donné . Donc (dans une syntaxe inexistante) SELECT id, amount LIMIT BY running_total(amount) 20 sélectionne les 2 premières lignes, ... LIMIT BY running_total(amount) 60 sélectionne toutes les lignes. Je ne peux pas changer le schéma pour garder le total en cours précalculé. Cela peut-il être fait raisonnablement efficacement? Ce serait acceptable si la réponse ne fonctionne que sur SQLite.

Répondre

1

Vous pouvez utiliser une sous-requête qui résume toutes les lignes avec un id inférieur:

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

COALESCE est d'attraper la première ligne, ce qui a une somme de null.

+0

Cela aura-t-il un comportement quadratique, ou les moteurs SQL sont-ils assez intelligents pour l'optimiser? –

+0

@Alexey Romanov: Je ne sais pas ce que vous entendez par quadratique, et si vous connaissez un moyen de voir le plan de requête de SqlLite faites le moi savoir :) – Andomar

+0

Le sous-objet pour la première ligne nécessite de regarder 0 lignes, par seconde: 1 ligne, puis 2, 3, etc. Si la Nième ligne est la bonne, nous avons dû regarder 0 + 1 + 2 + ... + (N-1) = N * (N - 1)/2 lignes. Mais il semble clair que nous n'avons besoin que de regarder N lignes. –

Questions connexes