Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
こんにちわ
累積合計での判別についてお伺いさせて下さい。
下記のようなテーブルがあります。
※テーブルは、key→Dateの昇順で並んでいる前提。
ID | Date | Volume |
---|---|---|
1 | 2018/1/1 | 1 |
1 | 2018/1/2 | 1 |
1 | 2018/1/3 | 1 |
1 | 2018/1/4 | 1 |
1 | 2018/1/5 | 1 |
2 | 2018/1/1 | 1 |
2 | 2018/1/2 | 1 |
2 | 2018/1/3 | 1 |
2 | 2018/1/4 | 1 |
2 | 2018/1/5 | 1 |
ロードスクリプト上で下記のような条件でVolumeを置き換えたいです。
条件:ID別でVolumeの累積合計が5になったときVolumeは0とする。
ID | Date | Volume | 累積合計 | Volume_New |
---|---|---|---|---|
1 | 2018/1/1 | 1 | 1 | 1 |
1 | 2018/1/2 | 1 | 2 | 1 |
1 | 2018/1/3 | 1 | 3 | 1 |
1 | 2018/1/4 | 1 | 4 | 1 |
1 | 2018/1/5 | 1 | 5 | 0 |
2 | 2018/1/1 | 1 | 1 | 1 |
2 | 2018/1/2 | 1 | 2 | 1 |
2 | 2018/1/3 | 1 | 3 | 1 |
2 | 2018/1/4 | 1 | 4 | 1 |
2 | 2018/1/5 | 1 | 5 | 0 |
上記を行うためのロードスクリプトを教えて頂けますでしょうか。
※QlikSenseでの作成をお願い致します。
※QlikSenseでの作成が難しい場合は、ロードスクリプトをそのまま教えて頂けますでしょうか。
どうぞよろしくお願いいたします。
QlikSenseで使えるかわからないですが、QlikViewで記述する場合は下記のようになります。
Peek関数やPrevious関数がSenseにもあれば、同じような記述が出来ると思います。
6日以降、累計合計が1に戻るのかと思い、これを想定した記述ですので、違う場合は6日以降のデータがどのようになるのかご返信下さい。
(スクリプト)
TEMP:
LOAD * INLINE [
ID, Date, Volume
1, 2018/01/01, 1
1, 2018/01/02, 1
1, 2018/01/03, 1
1, 2018/01/04, 1
1, 2018/01/05, 1
1, 2018/01/06, 1
1, 2018/01/07, 1
1, 2018/01/08, 1
1, 2018/01/09, 1
2, 2018/01/01, 1
2, 2018/01/02, 1
2, 2018/01/03, 1
2, 2018/01/04, 1
2, 2018/01/05, 1
2, 2018/01/06, 1
2, 2018/01/07, 1
2, 2018/01/08, 1
2, 2018/01/09, 1
];
TABLE:
LOAD ID,
Date,
Volume,
IF(ID=Previous(ID),IF(Peek(累積合計)=5,Volume,Peek(累積合計)+Volume)
,Volume) as 累積合計,
IF(ID=Previous(ID),IF(Peek(累積合計)+Volume=5,Num(0),Volume)
,Volume) as Volume_New
Resident TEMP
Order By ID,Date;
DROP Table TEMP;
(作成後のデータ)
ID | Date | Volume | 累積合計 | Volume_New |
1 | 2018/01/01 | 1 | 1 | 1 |
1 | 2018/01/02 | 1 | 2 | 1 |
1 | 2018/01/03 | 1 | 3 | 1 |
1 | 2018/01/04 | 1 | 4 | 1 |
1 | 2018/01/05 | 1 | 5 | 0 |
1 | 2018/01/06 | 1 | 1 | 1 |
1 | 2018/01/07 | 1 | 2 | 1 |
1 | 2018/01/08 | 1 | 3 | 1 |
1 | 2018/01/09 | 1 | 4 | 1 |
2 | 2018/01/01 | 1 | 1 | 1 |
2 | 2018/01/02 | 1 | 2 | 1 |
2 | 2018/01/03 | 1 | 3 | 1 |
2 | 2018/01/04 | 1 | 4 | 1 |
2 | 2018/01/05 | 1 | 5 | 0 |
2 | 2018/01/06 | 1 | 1 | 1 |
2 | 2018/01/07 | 1 | 2 | 1 |
2 | 2018/01/08 | 1 | 3 | 1 |
2 | 2018/01/09 | 1 | 4 | 1 |
QlikSenseで使えるかわからないですが、QlikViewで記述する場合は下記のようになります。
Peek関数やPrevious関数がSenseにもあれば、同じような記述が出来ると思います。
6日以降、累計合計が1に戻るのかと思い、これを想定した記述ですので、違う場合は6日以降のデータがどのようになるのかご返信下さい。
(スクリプト)
TEMP:
LOAD * INLINE [
ID, Date, Volume
1, 2018/01/01, 1
1, 2018/01/02, 1
1, 2018/01/03, 1
1, 2018/01/04, 1
1, 2018/01/05, 1
1, 2018/01/06, 1
1, 2018/01/07, 1
1, 2018/01/08, 1
1, 2018/01/09, 1
2, 2018/01/01, 1
2, 2018/01/02, 1
2, 2018/01/03, 1
2, 2018/01/04, 1
2, 2018/01/05, 1
2, 2018/01/06, 1
2, 2018/01/07, 1
2, 2018/01/08, 1
2, 2018/01/09, 1
];
TABLE:
LOAD ID,
Date,
Volume,
IF(ID=Previous(ID),IF(Peek(累積合計)=5,Volume,Peek(累積合計)+Volume)
,Volume) as 累積合計,
IF(ID=Previous(ID),IF(Peek(累積合計)+Volume=5,Num(0),Volume)
,Volume) as Volume_New
Resident TEMP
Order By ID,Date;
DROP Table TEMP;
(作成後のデータ)
ID | Date | Volume | 累積合計 | Volume_New |
1 | 2018/01/01 | 1 | 1 | 1 |
1 | 2018/01/02 | 1 | 2 | 1 |
1 | 2018/01/03 | 1 | 3 | 1 |
1 | 2018/01/04 | 1 | 4 | 1 |
1 | 2018/01/05 | 1 | 5 | 0 |
1 | 2018/01/06 | 1 | 1 | 1 |
1 | 2018/01/07 | 1 | 2 | 1 |
1 | 2018/01/08 | 1 | 3 | 1 |
1 | 2018/01/09 | 1 | 4 | 1 |
2 | 2018/01/01 | 1 | 1 | 1 |
2 | 2018/01/02 | 1 | 2 | 1 |
2 | 2018/01/03 | 1 | 3 | 1 |
2 | 2018/01/04 | 1 | 4 | 1 |
2 | 2018/01/05 | 1 | 5 | 0 |
2 | 2018/01/06 | 1 | 1 | 1 |
2 | 2018/01/07 | 1 | 2 | 1 |
2 | 2018/01/08 | 1 | 3 | 1 |
2 | 2018/01/09 | 1 | 4 | 1 |
Qlik Senseでも同じ関数が使用可能です。
若松さま Kawahataさま
いつもお返事有難うございます。
実際のテーブルはもう少し複雑で、うまく機能してくれていません。
要因がわかったら、改めて質問させて頂けますでしょうか。
少しお時間を頂けますと幸いです。
若松さま Kawahataさま
返信が遅くなり申し訳ございません。
頂いたスクリプトで無事出来ました。
有難うございます。
上手く行っていなかった理由は、実際のテーブルではデータが重複していたためだと思われます。
データのロードを
Load distinct ...
にしたら無事出来ました。