Lookerで表計算結果のランクを動的なフィルタとして使う


※タイトル通り&ほとんどこの記事の和訳です。

やりたかったこと

事前にviewで定義しておくのではなく、粒度や集計軸を動的に変えられるランクをフィルタとして使いたかった。

ハードル

  • 事前にviewで定義したrank dimensionを使うと、集計軸ごとに複数dimensionを作らなければいけない。
  • Explore上でTableCalcurations機能を使って作った計算結果はフィルタとして使えない。

使っているテクニック

やり方

①viewに type: numberのdimensionparameterの2つを追加する。この時、dimensionのsql句ではparameterの名前を指定する。(この例ではmax_rank)

parameter: max_rank {
 type: number
}

dimension: rank_limit {
 type: number
 sql: {% parameter max_rank %} ;;
}

②Exploreに移動。好みの粒度で集計し、ソートをかけたところにさっき作成したdimension(例ではrank_limit)を追加。max_rankはfilterとして追加し、上位何件表示したいかを入力しておく。


(max_rankで入力した値はrank_limitに渡され、固定値として表示される)

③表計算を2つ作成。1つ目はRankで、どの指標でランキングを作成するかを指定。2つ目はBooleanで、前に作成したRank計算結果とrank_limitを比較するもの。戻り値はyesno型。


(この時、表計算を利用するため表の中に使っていないmeasureを使うことはできないので注意)

④作成した2つの表計算はHide from Visualizationする。

⑤表計算結果であるshow_in_visualizationの設定から、Hide "No"s from Visualizationを選択すると、Noが返ってきている行がVisualizationに出てこなくなる。

解説

データベース上に存在しない値でもユーザー側から任意の値を入力できるparameterフィールドを予め作成しておき、
そのフィールドと表計算結果を比較することでyesno列を作成。
yesnoフィールドだとHide "No"s from Visualizationが使えるため、
ランキング上位のみ表示が実現しかつ何位まで表示したいかもユーザー側が制御できるようになる。

なので、厳密に言うとFilterとして使っているというよりは、Visualizationに表示していない、
というだけなんだと思う。

Hide "No"s from Visualizationは知らなかったし、parameterとの合わせ技としては
良いスキルアップ問題になりそうな内容だった。
parameterの拡張性の高さを考えると、まだまだ応用の余地がありそうですね。

(Appendix)Tableauだとこうやってた

rank関数かindex関数で計算フィールドを作って、フィルタとして適用。
viewには不連続値で入れて、フィルタには連続値として入れていた記憶がある。
(連続値じゃないとスライダーの見た目で操作できなかった)

参考文献(再掲)