一定期間毎の差分を取得するためにWithを利用して取得を試みたが、対象データの一部が存在しない場合差分が取れないため解消したいと考えております。何か良い方法がありましたらご助力頂けると幸いです。
サンプル
PostgreSQL
1CREATE TABLE zaikoTable( 2id integer not null, 3 zaiko integer not null, 4 date date not null ); 5 6INSERT INTO zaikotable VALUES(1,100,'2021-01-01'); 7INSERT INTO zaikotable VALUES(1,150,'2021-02-01'); 8INSERT INTO zaikotable VALUES(1,130,'2021-03-01'); 9INSERT INTO zaikotable VALUES(2,100,'2021-01-01'); 10INSERT INTO zaikotable VALUES(2,95,'2021-02-01'); 11INSERT INTO zaikotable VALUES(2,90,'2021-03-01'); 12INSERT INTO zaikotable VALUES(3,100,'2021-01-01'); 13INSERT INTO zaikotable VALUES(3,80,'2021-02-01'); 14INSERT INTO zaikotable VALUES(3,120,'2021-03-01'); 15INSERT INTO zaikotable VALUES(4,100,'2021-02-01'); 16INSERT INTO zaikotable VALUES(4,110,'2021-03-01');
※id:4 は2021/1/1のデータが存在しないものとします
id | zaiko | date |
---|---|---|
1 | 100 | 2021-01-01 |
1 | 150 | 2021-02-01 |
1 | 130 | 2021-03-01 |
2 | 100 | 2021-01-01 |
2 | 95 | 2021-02-01 |
2 | 90 | 2021-03-01 |
3 | 100 | 2021-01-01 |
3 | 80 | 2021-02-01 |
3 | 120 | 2021-03-01 |
4 | 100 | 2021-02-01 |
4 | 110 | 2021-03-01 |
取得したい値
2021/3/1を基準に2/1、1/1のデータと数量を比較します
このときid:4の1/1時点のデータを0として差分を取得させたい
id | diff 1month | diff 2month |
---|---|---|
1 | -20 | 30 |
2 | -5 | -10 |
3 | 40 | 20 |
4 | 10 | 110 |
差分取得
2021/3/1を基準に2/1、1/1のデータと数量を比較します
PostgreSQL
1With g0 As( 2 SELECT id, zaiko, date 3 FROM ZaikoTable 4 WHERE date = '2021/3/1' 5) , g1 As( 6 SELECT id, zaiko, date 7 FROM ZaikoTable 8 WHERE date = '2021/2/1' 9) ,g2 As( 10 SELECT id, zaiko, date 11 FROM ZaikoTable 12 WHERE date = '2021/1/1' 13) 14SELECT 15 g0.id, 16 g0.zaiko - g1.zaiko As "diff 1month", 17 g0.zaiko - g2.zaiko As "diff 2month" 18FROM g0, g1, g2 19WHERE g0.id = g1.id AND g0.id = g2.id ;
実行結果
whereで全て等式を条件にした結果全ての1/1、2/1、3/1すべてのデータが存在しないと出力されない結果となる
id | diff 1month | diff 2month |
---|---|---|
1 | -20 | 30 |
2 | -5 | -10 |
3 | 40 | 20 |

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/15 10:43