• 締切済み

PostgresSQLで累計計算を処理したい

SQLで以下のような処理をさせています。 select id,売上,入金,(select sum(売上-入金) from t1 where id<=x.id) as 累計 from t1 as x order by id ; データ行が少ない時は問題ないのですが、多くなるにつれ時間がかかります。最悪はタイムアウトが発生してしまいます。 中間テーブルを使う手もありますが、あまりしたくないので、どのようにすると高速処理が出来るのでしょうか? アドバイスをいただけませんか?

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.4

Create type hoge_type ( a int, b int ); →Create type hoge_type as ( a int, b int ); でした。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

うーん、PL/pgSQLでテーブル関数を作るぐらいかなあ。 Create type hoge_type ( a int, b int ); REATE OR REPLACE FUNCTION hoge() RETURNS SETOF hoge_type AS $$ DECLARE rec RECORD; ruikei Int; BEGIN Ruikei := 0; for rec in select id, 0 as b from t1 order by id loop rec.b := rec.id + ruikei; ruikei := rec.b; RETURN NEXT rec; End Loop; RETURN; END; $$ LANGUAGE plpgsql; SELECT * from hoge();

cad_bigin
質問者

お礼

ありがとうございます。 私も試したのですが。あまり・・・でした。 ま、サーバーも古いし、サーバーOSの当然古いので再度構築もあわせてバージョンアップを考えます。

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

select x.id,x.売上,x.入金,sum(y.売上-y.入金) 累計 from t1 as x,t1 as y where y.id <= x.id group by x.id,x.売上,x.入金 order by x.id ; じゃダメ? ## Posgre詳しくないし試す環境もないのであまり信頼性ないですが。 ## 試してみてください。

cad_bigin
質問者

お礼

連絡が遅れてすいません。スピードはあまり変わらなかったです。ありがとうございました。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

PostgreSQL8.4以降であれば select id,売上,入金,sum(売上-入金) over( order by id ) as 累計 from t1 order by id; と書けます. 商品ごとの累計の場合などは select id,商品ID,売上,入金,sum(売上-入金) over( partition by 商品ID order by id ) as 累計 from t1 order by id, 商品ID;

cad_bigin
質問者

補足

回答をありがとうございます。 残念ながら8.2です。 でもバージョンアップも今後考えます。他にアドバイスがあれば助かります。