Tableauにはクエリパイプラインという処理の順番があるらしい。
フィルタがうまく機能しないときとかはだいたいこいつのせい。なんとなく自分なりの理解ができた気がするので、忘れないように( ..)φメモメモ。
ちなみにTableauさんのヘルプページ下記。
https://help.tableau.com/current/pro/desktop/ja-jp/order_of_operations.htm
(なぜこんなにも理解しにくいのだろう。)
#処理の順番
Tableauさんによれば以下の通り。
1.抽出フィルター
2.データソースフィルター
3.コンテキストフィルター
4.セット、条件、上位Nフィルター、FixedのLOD表現の計算
5.ディメンジョンフィルター
6.データブレンド
7.INCLUDE、EXCLUDEのLOD表現の計算
8.メジャーのフィルター
9.合計の計算
10.予測、表計算の計算
11.傾向線、リファレンスラインの計算
今回はコンテキストフィルターとディメンジョンフィルター、メジャーのフィルターに焦点を当てて。
#やってみよう
今回はいつものスーパーストア。
お題:「2019年」の「家具」の売上が20万円以上の「顧客」を調べたい。
ということで、やってみよう。
オーダー年(2019年)、カテゴリ(家具)でフィルタして、顧客名で売上が20万円以上の条件フィルタをつけて、ドン。
20万円未満の人たちが残っている。何故。
(わかり易いように定数線もいれてみた。)
ということで、ここでクエリパイプラインの話が出てくるわけで。
##何が起きているのか
20万円以上の顧客名フィルタだけ残して、年・カテゴリのフィルタをすべてにしてみよう。オーダー年・カテゴリを列に入れてみるとこんな感じ。
(ついでに売上を色に移動して、ステップドカラーで20万円を境にピンクになるようにしてみる。)
なんやこれ・・・。
下の方まで見てみる。
総計の列を見てもらえばわかる通り、年・カテゴリによらず総計が20万でフィルタされている様子。(ちなみに顧客名のフィルタを外すと、20万未満の人も出てきます。)
ということは、さっき2019年の家具でフィルタしたのに20万円未満の人が存在したのは、総計で20万でフィルタした中で、2019年・家具でフィルタされているという事っぽい。
クエリパイプラインは同じディメンジョンフィルターなのになぜ総計のフィルタが優先されているように見えるのか・・・。
##ここが肝
ここで理解をしたいのが、同じレイヤーのフィルタ(今回で言えばディメンジョンフィルター)は同時にフィルタ処理がされる。
そのフィルタ処理をする対象は、フィルタをする前のテーブル。
今回のケースはフィルタがない状態のテーブルに対して、売上合計20万以上・2019年・家具を同時にフィルタする処理が走ったためこのような動きになると理解。
ではどうしたらよいか。オーダー年・カテゴリのフィルタが売上(顧客名)フィルタより優先されるようにすればいいと。クエリパイプラインで言えば、上位にあればいいと。
そんな時に使うのがコンテキストフィルター。
##コンテキストフィルターの使い方
使い方は簡単。
優先度をあげたいディメンジョンフィルターを右クリックして、コンテキストに追加を選択
フィルタの色がグレーになればOK。
それでは、オーダー年とカテゴリをコンテキストフィルターに変えてみよう。
できた!フィルタ入れ替えてもちゃんと動いてるっぽい。
ということで、フィルタした後にフィルタする(カテゴリを絞った上で上位Nをみる等)みたいな優先順位をつける必要があるときは、コンテキストを活用すればうまくいくと。
##別の方法
ここまではコンテキストフィルターの話。一応他のやり方も。
上の話の通り、オーダー年・カテゴリがクエリパイプラインの上にいればいいので、売上合計のフィルタを下に下げるって手も。今回は売上のメジャーがあるのでメジャーフィルターとして使えばやりたいことが実現。
顧客名のディメンジョンをフィルタから外して、売上のフィルタをドン。
下限を20万に設定してみると・・・
できた!
#おわりに
今回はフィルターの話だけにしたけど、LOD表現が絡むと結構重要になりそうなクエリパイプライン。FIXEDとその他で動作順序が違うとか罠だと思う。(しょうがないのだろうが・・・)
今回のメモもいつも通り自分の理解でつらつらと。
もし誰かが見て理解が違うよ!ってことがあれば教えてほしいです。切に。