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 行)

一次処理

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 行)

月末の値だけ取り出すことができました。

おすすめ

コメントを残す

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