[Tableau]追記型データにおける任意の日付におけるデータ(時点情報)の出力方法

tableau-icon-for-blog

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、yokatsukiです。

今回はDWH内のデータをTableauで表示するテクニックのお話です。
一般的にDWHに格納するデータは、変更が発生する度に追記する形で保存し、必要に応じてデータマートとして集約する形になるかと思います。

以下の様な注文履歴を格納する例を挙げてみます。

  1. 注文を保存する注文履歴テーブルは、注文IDと更新日付を主キーとしている
    ※本来であれば更新日付はタイムスタンプ型にしておかないと1日1回しか注文を受け付けられない構造になってしまいますが、サンプルということでご容赦ください

  2. 新規受注が発生すると、新しい注文IDが生成され、日付と共に注文テーブルに追記される。
    output-method-of-data-in-any-date-02

  3. 注文が更新された場合には同じ注文IDで、更新日付と共に更新後のデータを追記する
    output-method-of-data-in-any-date-03

この時「時点情報 = 特定の日付における注文状況を知りたい」場合には、どのような検索条件をつければよいでしょう?
さしあたって日付を指定したフィルタリングが思いつきますが、実際やってみるとうまく表示されません。なぜなら指定した日付に注文が発生していない、言い換えると最新の注文が指定した日付以前にある場合、指定した日付条件に適合しないのでデータが表示されないことになります。
output-method-of-data-in-any-date-04

このことから、時点情報を取り出す為には

  • 指定した日付以前のデータから、
  • 注文ID毎に最新の日付を持つレコードを1件取り出す

という条件を満たす必要があることがわかります。この条件を満たす為のTableau Desktop実装方法を、株式会社truestar様からアドバイス頂きましたので、ここで紹介します。truestar様ありがとうございました!

実装方針

指定した日付以前のデータを抽出する

指定した日付以前のデータを抽出する方法は、フィルタを使う方法と、パラメータを使う方法が考えられます。

フィルタを使う方法

更新日付をフィルタに設定し、[日付の範囲]-[終了日]を設定します。
output-method-of-data-in-any-date-12

パラメータを使う方法

日付型のパラメータを作り、
output-method-of-data-in-any-date-06

output-method-of-data-in-any-date-07

作成したパラメータを右クリックしてパラメータコントロールを表示しておいてください
output-method-of-data-in-any-date-07a

"[更新日付] <= [パラメータ]"となる計算フィールドを作成します。
output-method-of-data-in-any-date-08

output-method-of-data-in-any-date-08a

その後、計算フィールドをフィルターに設定します。
output-method-of-data-in-any-date-09

方法としてはどちらでも良いのですが、指定できる日付の範囲が異なります。
パラメータを使う場合は、データが存在しない日付も選択できるので、それが許容できない場合は、フィルタを使う方法が良いと思います。

注文ID毎に最新の日付を持つレコードを1件取り出す

結論から言うと、LAST関数を使用します。
LAST関数の定義は「現在の行からパーティション内の最後の行までの行数を返す」です。注文IDと更新日付の組み合わせでパーティションを構成すれば、注文IDに含まれる更新日付毎に番号が振られます。そこで最新の日付を持つ行を見ると、最後の行なので"0"が返されています。
LAST関数を含む計算フィールドを作成し、それをフィルターに追加した後で、表計算の編集から上記パーティションの設定を行う。

実装

それでは実際にやってみましょう。以下環境で実施しました。

  • Windows 10 Pro 64bit版
  • Tableau Desktop Professtional Edition 9.3.0 64bit

また、入力データは以下をOffice 365 ProPlusのExcelで作成しました。

注文ID、更新日付、注文数の配置

Talbeau Desktopで上記Excelファイルを開きます。
行シェルフに注文IDと更新日付、データ領域(更新日付列の右側に"Abc"と書かれた領域)に注文数を配置します。
output-method-of-data-in-any-date-10

注文ID毎、更新日付毎の注文数の合計値が表示されています。
※日付の表記が写真通りにできない場合は、更新日付を右クリックして、設定メニューの「正確な日付」「不連続」を選択してください。
output-method-of-data-in-any-date-11

フィルタによる日付条件の追加

日付の指定はパラメータでも可能ですが、先述の通りデータが存在しない日付を条件に含めないために、今回はフィルタによる設定とします。
更新日付をフィルターに設定し、"日付の範囲" - "終了日"と設定します。
output-method-of-data-in-any-date-12

また、フィルターに設定された更新日付を右クリックし、クイックフィルターを表示させます。
output-method-of-data-in-any-date-13

計算式(LAST関数)の追加

メジャー領域の空白を右クリックし、計算フィールドを新規に作成します。"最新日付確認"と名前を付けます。中身は、LAST関数のみです。引数の設定はありません。
output-method-of-data-in-any-date-14

LAST関数は「現在の行から指定領域内の最後の行までの行数を返す」動きをします。 デフォルトの指定領域は表全体なので、試しに最新日付確認を不連続に変更し行にドロップすると、表全体における行数がカウントダウンされていることが確認できます。
output-method-of-data-in-any-date-15

最新日付確認の編集

以下の操作で、最新日付確認の番号付与ルールを注文ID、更新日付毎に変更します。

  1. 行にドロップした計算フィールド"最新日付確認"を右クリックして、"表計算の編集"を選択
    output-method-of-data-in-any-date-16

  2. "次を使用して計算"ドロップダウンリストで"詳細..."を選択
    output-method-of-data-in-any-date-17

  3. "詳細"ウィンドウで、"注文ID"と"更新日付"を右側(場所の指定)へ移動
    output-method-of-data-in-any-date-18 ※ここの設定で注文IDと更新日付を考慮対象に設定できる

  4. "実行レベル"ドロップダウンリストで"更新日付"を選択
    output-method-of-data-in-any-date-19 ※ここの設定で更新日付毎にLAST関数が適用される

  5. "再開間隔"ドロップダウンリストで"注文ID"を選択
    output-method-of-data-in-any-date-20 ※ここの設定で、更新日付毎に設定したLAST関数の番号が、注文ID毎にリセットされるようになる

  6. "OK"ボタンを押し、設定を閉じる

ここまでの設定で、注文IDに含まれる更新日付毎に番号が振られ、最新の日付を持つ行には最後の行である"0"が設定されるようになります。
output-method-of-data-in-any-date-21

最新日付確認をフィルタに追加

編集を行った"最新日付確認"をフィルターに移動し、条件として"0"だけを選択します。
output-method-of-data-in-any-date-22 これで「LAST関数の値が0 = 注文ID毎の更新日付が最新のデータ」だけが抽出されました。

完成イメージ

更新日付のスライダーを動かすと、スライダーで指定した日付時点での最新の注文状況が確認できます。
output-method-of-data-in-any-date-23

例えば、注文ID1000002の注文は8/31に200の後、9/3に180に変更されているのですが、9/2の時点では8/31の200が最新なのでそれが表示されていることがわかります。

以上で完成です。

まとめ

追記型データの時点情報を取り出す方法について確認しました。

完成したTableauワークシートを添付しますので、参考になれば幸いです。

添付ワークシートの各タブに、上記操作の途中経過を保存しています。 それぞれのタブは、説明を実装した後の状態にしています。

それでは、また。

AWS Cloud Roadshow 2017 福岡