売上テーブルから集計用テーブルへ会員ごとの売上額を合算して更新したい
売上テーブル(uriage_total)と集計用テーブル(rfm_analytics_raw_total)があります。
uriage_total
会員ID | 購入日 | 商品コード | 枝番 | 個数 | 金額 |
---|---|---|---|---|---|
0001 | 2019/1/1 | A001 | 01 | 2 | 10000 |
0001 | 2019/2/14 | A002 | 01 | 3 | 15000 |
0002 | 2019/1/10 | A001 | 01 | 2 | 8000 |
0002 | 2019/2/20 | A002 | 01 | 3 | 15000 |
0002 | 2019/3/24 | A002 | 01 | 3 | 10000 |
↑他にも項目がありますが、今回は不要と考えますので割愛します。
rfm_analytics_raw_total
会員ID | 購入日 | 商品コード | 枝番 | 個数 | 金額 | 集計_直近購入日 | 集計_回数 | 集計_総額 | Mランク |
---|---|---|---|---|---|---|---|---|---|
0001 | 2019/1/1 | A001 | 01 | 2 | 10000 | 2019/2/14 | 2 | ||
0001 | 2019/2/14 | A002 | 01 | 3 | 15000 | 2019/2/14 | 2 | ||
0002 | 2019/1/10 | A001 | 01 | 2 | 8000 | 2019/3/24 | 3 | ||
0002 | 2019/2/20 | A002 | 01 | 3 | 15000 | 2019/3/24 | 3 | ||
0002 | 2019/3/24 | A002 | 01 | 3 | 10000 | 2019/3/24 | 3 |
↑上記のuriage_totalに集計用のカラムを追加したものです。
他にも集計用にあとからupdateする対象となる項目がありますが、今回は不要ですので割愛します。
上記の例のように「集計_直近購入日」と「集計_回数」には値が入っています。
同じ値が複数のレコードに入っており、本来はrfm_analytics_raw_totalは正規化すべきでしょうが、今回は今までの流れからこのように正規化していない状態です。ご了承ください。
###実現したいこと
やりたいこととしては右側の集計_総額に会員IDごとの金額の合計を入れて、その金額の範囲に応じてMランクに1〜3の値を入れることです。
アウトプットとしては下記のようになります。
会員ID | 購入日 | 商品コード | 枝番 | 個数 | 金額 | 集計_直近購入日 | 集計_回数 | 集計_総額 | Mランク |
---|---|---|---|---|---|---|---|---|---|
0001 | 2019/1/1 | A001 | 01 | 2 | 10000 | 2019/2/14 | 2 | 25000 | 2 |
0001 | 2019/2/14 | A002 | 01 | 3 | 15000 | 2019/2/14 | 2 | 25000 | 2 |
0002 | 2019/1/10 | A001 | 01 | 2 | 8000 | 2019/3/24 | 3 | 33000 | 1 |
0002 | 2019/2/20 | A002 | 01 | 3 | 15000 | 2019/3/24 | 3 | 33000 | 1 |
0002 | 2019/3/24 | A002 | 01 | 3 | 10000 | 2019/3/24 | 3 | 33000 | 1 |
下記のSQLを実行したのですが、
sql
1update rfm_analytics_raw_total 2set 集計_総額= t1.amt_total 3from ( 4 select tt2.会員ID, sum(tt1.金額) as amt_total 5 from uriage_total tt1 6 join rfm_analytics_raw_total tt2 using(会員ID) 7 group by tt2.会員ID 8 ) as t1 9where rfm_analytics_raw_total.会員ID = 会員ID;
下記のエラーが出てしまいました。
ERROR: integer out of range SQL 状態: 22003
なお、集計_直近購入日を更新するために下記のSQLを実行してこちらは成功しました。
(これをベースに上記のSQLにアレンジしました)
sql
1update rfm_analytics_raw_total 2set 集計_直近購入日= t1.maxdate 3from ( 4 select tt2.会員ID, max(tt1.予約日) as maxdate 5 from uriage_total tt1 6 join rfm_analytics_raw_total tt2 using(会員ID) 7 group by tt2.会員ID 8 ) as t1 9where rfm_analytics_raw_total.会員ID = t1.会員ID;
###環境
macローカル PostgreSQL 13.4(pgadmin4)
テーブルのレコード数はそれぞれ240万件ほど(レコード数は同じ)です。
回答2件
あなたの回答
tips
プレビュー