だから、私はテーブルを作りました:
create table whatever ( time_c int4, speed int4, distance int8);
そしていくつかの行を挿入しました:
insert into whatever (time_c, speed) select i, random() * 100 from generate_series(1,10) i;
これにより、次のデータが得られました。
$ select * from whatever;
time_c | speed | distance
--------+-------+----------
1 | 53 | [null]
2 | 17 | [null]
3 | 53 | [null]
4 | 46 | [null]
5 | 31 | [null]
6 | 18 | [null]
7 | 42 | [null]
8 | 15 | [null]
9 | 1 | [null]
10 | 51 | [null]
(10 rows)
次に、次のDO
コマンドを使用します。
do $$
DECLARE
tmp_cur cursor for SELECT * FROM whatever ORDER BY time_c for UPDATE;
temprec record;
total_distance INT4 := 0;
BEGIN
open tmp_cur;
LOOP
fetch tmp_cur INTO temprec;
EXIT WHEN NOT FOUND;
total_distance := total_distance + temprec.speed;
UPDATE whatever SET distance = total_distance WHERE CURRENT OF tmp_cur;
END LOOP;
END;
$$;
そしてそれだけです:
$ select * from whatever;
time_c | speed | distance
--------+-------+----------
1 | 53 | 53
2 | 17 | 70
3 | 53 | 123
4 | 46 | 169
5 | 31 | 200
6 | 18 | 218
7 | 42 | 260
8 | 15 | 275
9 | 1 | 276
10 | 51 | 327
(10 rows)