PostgreSQL 入出金テーブルから月締め集計ビュー作成
入出金情報が入ったテーブルから月締めの集計ビューを作る方法を試します。
元データ
以下のデータを対象にします。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | select * from account; #結果 dates | in_amount | out_amount | balance ------------+-----------+------------+--------- 2019-10-01 | 100 | | 10100 2019-10-02 | | 1000 | 9100 2019-10-02 | 3000 | | 12100 2019-10-02 | 10000 | | 22100 2019-10-20 | | 1000 | 21100 2019-10-24 | 2000 | | 23100 2019-11-03 | | 3000 | 20100 2019-11-06 | | 4000 | 16100 2019-11-15 | 30000 | | 46100 2019-11-15 | | 2000 | 44100 2019-11-25 | | 100 | 44000 2019-11-26 | 3000 | | 47000 2019-11-27 | | 25000 | 22000 2019-11-28 | 1000 | | 23000 (14 & #34892;) |
一次処理
row_number() over()と年月を抽出した行を追加します。
01 02 03 04 05 06 | select row_number() over() ,to_char(dates, 'yyyymm' ) as year_month ,* from account |
結果
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | row_number | year_month | dates | in_amount | out_amount | balance ------------+------------+------------+-----------+------------+--------- 1 | 201910 | 2019-10-01 | 100 | | 10100 2 | 201910 | 2019-10-02 | | 1000 | 9100 3 | 201910 | 2019-10-02 | 3000 | | 12100 4 | 201910 | 2019-10-02 | 10000 | | 22100 5 | 201910 | 2019-10-20 | | 1000 | 21100 6 | 201910 | 2019-10-24 | 2000 | | 23100 7 | 201911 | 2019-11-03 | | 3000 | 20100 8 | 201911 | 2019-11-06 | | 4000 | 16100 9 | 201911 | 2019-11-15 | 30000 | | 46100 10 | 201911 | 2019-11-15 | | 2000 | 44100 11 | 201911 | 2019-11-25 | | 100 | 44000 12 | 201911 | 2019-11-26 | 3000 | | 47000 13 | 201911 | 2019-11-27 | | 25000 | 22000 14 | 201911 | 2019-11-28 | 1000 | | 23000 (14 行) |
二次処理
一次処理で得られたyear_monthごとにgroup_byし、row_numberが最大のレコードだけ残すクエリと一次処理の結果を結合します。
SQLとしては以下の通り。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | select t1.year_month ,dates ,balance from ( select max (row_number) as row_number ,year_month from ( select row_number() over() as row_number ,to_char(dates, 'yyyymm' ) as year_month ,* from account ) as t0 group by year_month ) as t1 left join ( select row_number() over() as row_number ,to_char(dates, 'yyyymm' ) as year_month ,* from account ) as t2 using(row_number) |
結果
01 02 03 04 05 | year_month | dates | balance ------------+------------+--------- 201910 | 2019-10-24 | 23100 201911 | 2019-11-28 | 23000 (2 行) |
月末の値だけ取り出すことができました。