2010-09-24 25 views
9

Mam tabeli jak ten:SQLite: Akumulatory (suma) kolumna SELECT

wartość wybierz z tabeli;

value 
1 
3 
13 
1 
5 

Chciałbym dodać kolumnę akumulatora, tak że mam ten wynik:

value accumulated 
1  1 
3  4 
13  17 
1  18 
5  23 

Jak mogę to zrobić? Jakie jest prawdziwe imię tego, co chcę zrobić? Dzięki

Odpowiedz

11

spróbować w ten sposób:

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

ale jeśli to nie będzie działać na bazie danych, po prostu dodaj zamówienie czegoś

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 

to działa na wyrocznię;), ale powinna ona na zasadzie sqlite też

+0

Gdyby działał na stole bez id do zamawiania (lub zamawiania po innym kryterium, bez możliwości ścisłego moala

+0

Możesz to zrobić za pomocą zapytania analitycznego kiedy korzystasz z Oracle, nie ma potrzeby samodzielnego łączenia, patrz http://www.orafaq.com/node/55. Niestety sqlte nie obsługuje zapytań analitycznych. – TTT

1

Operacja jest nazywana sumą bieżącą. SQLite nie obsługuje go tak jak jest, ale istnieją sposoby, aby go uruchomić. Jeden jest taki, jak opublikował Sebastian Brózda. Kolejny szczegółowo opisałem here w innym pytaniu.

+0

lub "suma całkowita". Dzięki. – moala

1

Oto metoda tworzenia całkowitej sumy bez nieskuteczności zsumowania wszystkich poprzednich wierszy. (Wiem, że to pytanie ma 6 lat, ale jest to jeden z pierwszych wpisów google SQLite sumie jezdnego.)

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 

ten powinien być uruchamiany tylko raz po zaimportowaniu wszystkich wartości. Lub ustaw zbiorczą kolumnę na wszystkie wartości null przed ponownym uruchomieniem.

+0

Działa to świetnie. Wziąłem duży stół, który opierał się innym wzorom akumulacji i wybrał (według kolejności) odpowiednie pola do tabeli tymczasowej z autoinkrementacją, a następnie użył tego wzorca dodając 't1.itemId = ROWPRIOR.itemId' do miejsca, gdzie klauzula. Za każdym razem, gdy trafi nowy przedmiot, akumulacja zaczyna się od nowa. Cięcie wielogodzinnego czasu pracy na około 15 sekund. – chad