Tableau のリファレンス「計算作成のベストプラクティス」を読んでみた
はじめに
計算フィールドとは,Tableau で用意された計算関数を用いて作られた新たなフィールドのことです.Tableau には IF をはじめとした条件分岐や SUM などおなじみの集計など多くの計算関数が用意されています.
計算フィールドは,非常に便利な機能であるものの,その書き方には気をつけないと無駄なクエリが発生し,ダッシュボードのパフォーマンスに影響します.そこで,Tableau のリファレンスでは,計算フィールドのベストプラクティスが公開されています:
今回は,このベストプラクティスから,私自身も失敗したことがある例をいくつか取り上げて紹介します.
上記のベストプラクティスには,この記事で取り上げたもの以外にも様々なベストプラクティスが乗っていますので,一読することをおすすめします.
1. 別の計算で計算フィールドを複数回使用するのを避ける
NG 例:
// [文字列を返す計算フィールド] の計算結果から、先頭 1 文字を取り除く計算
RIGHT([文字列を返す計算フィールド], LEN([[文字列を返す計算フィールド]]) -1)
この NG 例では,[文字列を返す計算フィールド] を 2 回参照しています.そのため,LEN 関数と RIGHT 関数の実行でそれぞれ [文字列を返す計算フィールド] を求める同じ計算が実行されます.
これは,意識せず計算フィールドを使っているとやってしまう NG 例だと思いました.私自身も同じ計算フィールドを何回も参照する計算フィールドを書いたことがあり,このベストプラクティスを見たときにはハッと気付かされました.
改善例:
MID([文字列を返す計算フィールド], 2)
今回の NG 例であれば,MID 関数を用いることで,[文字列を返す計算フィールド] の参照を 1 回に抑えることができます.よりシンプルに実装できる方法こそ,パフォーマンス的に優れているということになります.
2. 複数の文字列計算は、単一の REGEXP 計算にする
NG 例:
// [グループ名を返す計算フィールド] に A~Fグループが含まれているなら、
// ひとつのグループ名にまとめ、それ以外なら、[グループ名を返す計算フィールド] をそのまま返す計算フィールド
IF CONTAINS([グループ名を返す計算フィールド],'Aグループ')
OR CONTAINS([グループ名を返す計算フィールド],'Bグループ')
OR CONTAINS([グループ名を返す計算フィールド],'Cグループ')
OR CONTAINS([グループ名を返す計算フィールド],'Dグループ')
OR CONTAINS([グループ名を返す計算フィールド],'Eグループ')
OR CONTAINS([グループ名を返す計算フィールド],'Fグループ')
THEN 'A~Fグループ'
ELSE [グループ名を返す計算フィールド] END
問題となるポイントは,1つ目のベストプラクティスと同様で,IF の条件判定のために [グループ名を返す計算フィールド] が複数回参照されている点です.
改善例:
IF REGEXP_MATCH(
[グループ名を返す計算フィールド],
'Aグループ|Bグループ|Cグループ|Dグループ|Eグループ|Fグループ'
) THEN 'A~Fグループ'
ELSE [グループ名を返す計算フィールド] END
NG 例と同様の計算は正規表現による文字列マッチングを行う関数 REGEXP_MATCH にて実装できます.正規表現を使う関数は,ドキュメントだと「その他の関数」にあり,少し見つけづらいですが,上記のような「あるある」な処理を効率的に実装するためにも,頭に入れていきたいところです.
3. 計算にセットを使用するときには、セットをセット以外の要素に置き換える
NG 例:
// [売上トップ10顧客名が入ったセット] に含まれていれば,[顧客グループ]を返し,
// 含まれていなければ,その他 と返す計算
IF [売上トップ10顧客名が入ったセット]
THEN [顧客グループ]
ELSE 'その他' END
[売上トップ10顧客名が入ったセット] に含まれているかどうかで返す値を変えるというものですが,条件判定に直接セットを表すフィールドが用いられています.これも何度もやらかしたことがある計算です.
改善例:
IF [売上トップ10顧客名が入ったセット] = 'IN'
THEN [顧客グループ]
ELSE 'その他' END
変わったのは,IF の条件のところで [売上トップ10顧客名が入ったセット] = 'IN' としており,'IN' (セットに含まれている)なら True,'OUT'(セットに含まれていない)なら False とブール値にしてから,IF の条件判定を行っています.
まとめ
今回の記事では,Tableau のリファレンスにある計算フィールドのベストプラクティスから,過去に私が失敗したことがあるものを取り上げてご紹介しました.Tableau の計算フィールドは強力な機能ではあるものの,適当に作成してしまうと,ダッシュボードのパフォーマンスに影響を及ぼします.こういったベストプラクティスを頭に入れながら,パフォーマンスを意識した計算フィールドを書くことが重要です.
是非,他の記事やnote更新もチェックしてくださいね!