h.yamada/ 2022年 9月 8日/ 技術

こんにちは、ヤマダです。
札幌は過ごしやすい季節となってきました。油断すると風邪をひきそうです。
さて今回はQlikのExistsについてのテクニックをお伝えします。

Existsとは

ロードスクリプトのLOADの条件(Where)で使用します。
特定の項目に該当するデータをロードしたり、増分ロードでは特定項目以外(not Exists)のデータをロードする際に使用します。
公式ドキュメントはこちら

使用上で気をつけること

意図しない結果になった

Existsを使用する時点で、項目名を複数のテーブルでロードしている場合には注意が必要です。
例えば、テーブルA、テーブルBの両方で「伝票NO」の項目をリロード済の状態でExistsを使用すると、テーブルA、テーブルBの何れかに存在したデータを抽出することになります。

凡ミスなのですが、最初のころよくハマったんですよね。。スクリプトが長くなると既に同じ項目でリロード済みだったりして何でだろう、、、って、無駄な時間を使ったことが多々ありました。Existsを使う場合はどのテーブルでロードしていたか事前に確認しましょう。

Existsで使用する項目を連結している場合

定義する項目を連結して設定する場合があるかと思います。
例えばPrimaryKey=(key1 と key2の文字列連結)の場合

Where Exists(PrimaryKey, key1 & key2)

これでも問題はありませんが、件数が多い場合はリロード時間が結構かかります。
その際は、連結した項目を作成しExistsを使用することでリロード時間の短縮が見込めます。
先ほどの例で言うと、key1 と key2の文字列連結を「PrimaryKey1」として定義にロードします。

Where Exists(PrimaryKey, PrimaryKey1)

これで処理時間が早くなります。
増分ロードではパフォーマンスに注意したいところではありますので、項目をQVDにロードしておきましょう。

Existsを使用したサンプルスクリプト

Existsを使用した増分ロードのスクリプトはこんな感じになるかと思います。
order + linenoが増分用のKeyとした例になります。
(前回処理日の制御はここでは割愛します)

// 前回処理日を変数にセット
LET LastExecDate = [前回処理日];

// 追加分のデータをロード
data:
LOAD 
    order, 
    lineno, 
    amount, 
    update_date,
    order & lineno  as IncrementalKey       //差分用のkeyをセット
FROM transaction
Where update_date >= $(LastExecDate)
;

// 過去分から追加分に存在しないデータのみリロード
Concatenate(data)
LOAD * From [data.qvd](qvd)
Where not Exists(IncrementalKey);
;

STORE data into data.qvd(qvd);
DROP Table data;

今日はこんなところになります。
ではまた!

About h.yamada

BIやってます。 初めに触ったBIはPentaho、一番長いのはQlikViewで約10年、Tableauも少々。 Tableau Desktop Certified Associateの資格も持ってました(有効期限切れ)