2010-09-24 16 views

risposta

11

provare in questo modo:

select value, 
(select sum(t2.value) from table t2 where t2.id <= t1.id) as accumulated 
from table t1 

ma se non funziona sul database, basta aggiungere l'ordine da qualcosa

select value, 
(select sum(t2.value) from table t2 where t2.id <= t1.id order by id) as accumulated 
from table t1 
order by id 

questo funziona su un oracolo;) ma dovrebbe su un sqlite

+0

Se avesse funzionato su un tavolo senza id per l'ordine (o per ordinare dopo un altro criterio, senza possibilità di strict moala

+0

Puoi farlo con una query analitica quando si utilizza Oracle, non sono necessari join personali, consultare http://www.orafaq.com/node/55. Purtroppo sqlte non supporta query analitiche. – TTT

1

L'operazione è denominata somma parziale. SQLite non lo supporta come è, ma ci sono modi per farlo funzionare. Uno è proprio come ha scritto Sebastian Brózda. Un altro I ha dettagliato here in un'altra domanda.

+0

o "totale parziale". Grazie. – moala

1

Ecco un metodo per creare un totale parziale senza l'inefficienza di sommare tutte le righe precedenti. (So ​​che questa domanda è di 6 anni ma è una delle prime voci di Google per funzionamento totale SQLite.)

create table t1 (value integer, accumulated integer, id integer primary key); 
insert into t1 (value) values (1); 
insert into t1 (value) values (3); 
insert into t1 (value) values (13); 
insert into t1 (value) values (1); 
insert into t1 (value) values (5); 

UPDATE 
    t1 
SET 
    accumulated = ifnull(
    (
     SELECT 
      ifnull(accumulated,0) 
     FROM 
      t1 ROWPRIOR 
     WHERE 
      ROWPRIOR.id = (t1.id -1)),0) + value; 


.headers on 
select * from t1; 
value|accumulated|id 
1|1|1 
3|4|2 
13|17|3 
1|18|4 
5|23|5 

Questo deve essere eseguito solo una volta dopo l'importazione di tutti i valori. Oppure, imposta la colonna accumulata su tutti i null prima di eseguire nuovamente.

+0

Funziona alla grande. Ho preso un grande tavolo che resisteva ad altri schemi di accumulo e ho selezionato (con ordine per) i campi rilevanti in una tabella temporanea con un autoincremento, e poi ho usato questo schema aggiungendo un 't1.itemId = ROWPRIOR.itemId' al dove clausola. Ogni volta che colpisce un nuovo oggetto, l'accumulo ricomincia. Tagliare un tempo di esecuzione di più ore fino a 15 secondi. – chad

Problemi correlati