PostgreSQL 累積値を計算するSQL
目的
ある値の累積値をSQLで計算する。
Step1 : テーブル用意
以下のようなテーブルを用意します。
CREATE TABLE test_accumulation(
年 int
,月 int
,値 int
)
この年、月、値というカラムにそれぞれ、以下のようなテストデータを入れます。
年 | 月 | 値
------+----+----
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で簡単に実現可能です。
SELECT
年
,月
,値
,SUM(値) OVER(ORDER BY 年,月) AS 累積値
FROM
test_accumulation
結果
年 | 月 | 値 | 累積値
------+----+----+--------
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でソートしておくことです。