PostgreSQL

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でソートしておくことです。

-PostgreSQL

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

PostgreSQL 同一日内の入出金データのグラフ化

最近は自分の口座の残高や入出金履歴などは銀行のオンランサイトのサービスにログインしてインターネット経由で確認することができるようになっています。今銀行サイトからダウンロードした口座の入出金データをグラ …

横持ちデータを縦持ちへ変換するSQL

Contents1 目的2 環境3 使用データ4 縦持ちにするSQL 目的 BIなどでグラフを書く場合、データが横持になっているとうまくグラフ化できない、といったケースがあります。ということでSQLで …

PostgreSQL 入出金テーブルから月締め集計ビュー作成

入出金情報が入ったテーブルから月締めの集計ビューを作る方法を試します。 Contents1 元データ2 一次処理3 二次処理 元データ 以下のデータを対象にします。 select * from acc …

【PostgreSQL】前後の行を取得できるLAG LEAD関数の使い方

Contents1 概要2 準備3 LAG(), LEAD()の使い方3.1 SQL例3.2 結果3.3 SQL例3.4 結果4 便利な例4.1 SQL例4.2 結果 概要 PostgreSQLで使用 …

【PostgreSQL】縦持ちデータを横持ち変換し前年同月との比較をする

Contents1 目的2 元データ3 横持にするSQL4 結果5 まとめ 目的 システムから取り出したデータは正規化されており縦持ちのデータ構造が多いですが、口座の残高やカードの支払い金額など、前年 …

言語切り替え

カテゴリー