1

列を持つpostgresqlデータベースにテーブルがあるとします:time,speed

列 " distance" を追加したので、距離の値を次のように挿入します。

   row[time+1].distance = row[time].distance + row[time+1].speed 

テーブルを更新する最速の方法はどれですか?

アップデート

次のようなことを試してみたい:

d = 0.0
for row in select time,speed from my_table loop
  d = d + row.speed
  update my_table set distance = d where time = row.time
end loop

これが最善の方法ですか?このスニペットを実行するにはどうすればよいですか?

4

3 に答える 3

1

だから、私はテーブルを作りました:

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)
于 2013-06-27T11:00:55.200 に答える