次のようなテーブルがあります。
テーブルから値を選択します。
value
1
3
13
1
5
次の結果が得られるように、アキュムレータ列を追加したいと思います。
value accumulated
1 1
3 4
13 17
1 18
5 23
これどうやってするの?やりたいことの本当の名前は?ありがとう
次のようなテーブルがあります。
テーブルから値を選択します。
value
1
3
13
1
5
次の結果が得られるように、アキュムレータ列を追加したいと思います。
value accumulated
1 1
3 4
13 17
1 18
5 23
これどうやってするの?やりたいことの本当の名前は?ありがとう
この方法を試してください:
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でも動作するはずです
これは、前のすべての行を合計するという非効率な方法で現在の合計を作成する方法です。(この質問が 6 年前のものであることは知っていますが、これは sqlite ランニング トータルの最初の Google エントリの 1 つです。)
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
これは、すべての値をインポートした後に 1 回だけ実行する必要があります。または、再度実行する前に、累積された列をすべて NULL に設定します。
この操作はランニングサムと呼ばれます。SQLite はそのままではサポートしていませんが、機能させる方法はあります。1 つは Sebastian Brózda が投稿したとおりです。ここで別の質問で詳しく説明したもう1つのこと。