SQLite: столбец накопителя (суммы) в инструкции SELECT

У меня есть такая таблица:

ВЫБРАТЬ значение ИЗ таблицы;

value
1
3
13
1
5

Я хотел бы добавить столбец аккумулятора, чтобы у меня был такой результат:

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

Как я могу это сделать? Как на самом деле называется то, чем я хочу заниматься? Спасибо


person moala    schedule 24.09.2010    source источник


Ответы (3)


попробуйте так:

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

но если это не будет работать в вашей базе данных, просто добавьте порядок чем-то

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

это работает на оракуле;) но это должно быть и на sqlite

person Sebastian Brózda    schedule 24.09.2010
comment
Если бы он работал на столе без идентификатора для заказа (или заказа по другому критерию, без возможности строгого сравнения ‹ или уникального ‹=), я бы принял этот ответ... - person moala; 24.09.2010
comment
Вы можете сделать это с помощью аналитического запроса при использовании Oracle, самостоятельное соединение не требуется, см. orafaq.com/node /55. К сожалению, sqlte не поддерживает аналитические запросы. - person TTT; 25.09.2010

Вот метод создания промежуточного итога без неэффективного суммирования всех предыдущих строк. (Я знаю, что этому вопросу 6 лет, но это одна из первых записей Google для текущего итога 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

Это следует запускать только один раз после импорта всех значений. Или установите для накопленного столбца все значения NULL перед повторным запуском.

person TomWitt2    schedule 24.05.2016
comment
Это прекрасно работает. Я взял большую таблицу, которая сопротивлялась другим шаблонам накопления, и выбрал (с порядком) соответствующие поля во временную таблицу с автоинкрементом, а затем использовал этот шаблон, добавив t1.itemId = ROWPRIOR.itemId в предложение where. Каждый раз, когда он попадает в новый предмет, накопление начинается заново. Сократите многочасовое время работы до 15 секунд. - person chad; 11.10.2017

Операция называется бегущей суммой. SQLite не поддерживает его как есть, но есть способы заставить его работать. Один такой же, как написал Себастьян Брозда. Другой я подробно описал здесь в другом вопросе.

person MPelletier    schedule 26.09.2010