- 締切済み
PostgresSQLで累計計算を処理したい
SQLで以下のような処理をさせています。 select id,売上,入金,(select sum(売上-入金) from t1 where id<=x.id) as 累計 from t1 as x order by id ; データ行が少ない時は問題ないのですが、多くなるにつれ時間がかかります。最悪はタイムアウトが発生してしまいます。 中間テーブルを使う手もありますが、あまりしたくないので、どのようにすると高速処理が出来るのでしょうか? アドバイスをいただけませんか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- nora1962
- ベストアンサー率60% (431/717)
Create type hoge_type ( a int, b int ); →Create type hoge_type as ( a int, b int ); でした。
- nora1962
- ベストアンサー率60% (431/717)
うーん、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();
- Siegrune
- ベストアンサー率35% (316/895)
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詳しくないし試す環境もないのであまり信頼性ないですが。 ## 試してみてください。
お礼
連絡が遅れてすいません。スピードはあまり変わらなかったです。ありがとうございました。
- nora1962
- ベストアンサー率60% (431/717)
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;
補足
回答をありがとうございます。 残念ながら8.2です。 でもバージョンアップも今後考えます。他にアドバイスがあれば助かります。
お礼
ありがとうございます。 私も試したのですが。あまり・・・でした。 ま、サーバーも古いし、サーバーOSの当然古いので再度構築もあわせてバージョンアップを考えます。