PostgreSQL 累積値を計算するSQL
目的
ある値の累積値をSQLで計算する。
Step1 : テーブル用意
以下のようなテーブルを用意します。
01 02 03 04 05 | CREATE TABLE test_accumulation( 年 int ,月 int ,値 int ) |
この年、月、値というカラムにそれぞれ、以下のようなテストデータを入れます。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | 年 | 月 | 値 ------+----+---- 2019 | 4 | 5 2019 | 5 | 13 2019 | 6 | 5 2019 | 7 | 9 2019 | 8 | 15 2019 | 9 | 24 2019 | 10 | 5 2019 | 11 | 32 2019 | 12 | 9 2020 | 1 | 13 2020 | 2 | 24 2020 | 3 | 19 (12 行) |
Step2 : 累積値を計算するSQL
上記の値の横に、その年、月までの累積値が計算されたカラムを追加します。これはOVER句を使用した以下のようなSQLで簡単に実現可能です。
01 02 03 04 05 06 07 | SELECT 年 ,月 ,値 , SUM (値) OVER( ORDER BY 年,月) AS 累積値 FROM test_accumulation |
結果
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | 年 | 月 | 値 | 累積値 ------+----+----+-------- 2019 | 4 | 5 | 5 2019 | 5 | 13 | 18 2019 | 6 | 5 | 23 2019 | 7 | 9 | 32 2019 | 8 | 15 | 47 2019 | 9 | 24 | 71 2019 | 10 | 5 | 76 2019 | 11 | 32 | 108 2019 | 12 | 9 | 117 2020 | 1 | 13 | 130 2020 | 2 | 24 | 154 2020 | 3 | 19 | 173 |
OVER句を使うことで、該当する行までの間がSUMされるので、結果として累積値が得られます。ポイントとしては、累積値を求める問題の場合、順番が重要になることが多いはずですので、OVER句内にORDER BYでソートしておくことです。