Tableau Prepで1レコード上のデータを取るにはどうしたらよいでしょうか?
AlteryxではMulti-Row Formulaでできるのですが、Tableau Prepにはそのような便利な機能はありません。
そこで、以前の記事「ソート方法3選 Prepで並び替えをする方法を紹介!」でご紹介したRANK()関数と、結合(Join)の合わせ技でやる方法をご紹介します!
サンプルデータ
こちらが今回使うサンプルデータです。
会員ID、購入日をデータとして持っています。
■サンプルデータ
ここに前回購入日という列を新たに持たせたいと思います。
■期待結果
会員IDごとに購入日でソートし、1行上の購入日を取得する、という感じです。
では早速やってみましょう。
フロー全体像
まず今回作るフローの全体像がこちらです。Stepごとに手順を説明していきます。
【Step1】会員IDごとに購入日の昇順でソートし、連番を振る
前回の記事の最後に、RANK()は連番を振るのにも使える、ということをご紹介しました。
計算フィールドを作成し、次の式を入れます。
フィールド名:RecordID
{ PARTITION[会員ID]: {ORDERBY[購入日]ASC:RANK()}}
会員ID別に連番が振られました。
(会員IDの並び順は順不同になっていますが、今はこのまま進めます。)
【Step2】RecordIDに+1した列を追加する
クリーニングステップを追加し、計算フィールドを作成します。
フィールド名:RecordID+1
[RecordID]+1
【Step3】Step1とStep2の結果をLeft Joinする
Step1をLeft、Step2をRightに設定し
・会員ID=会員ID
・RecordID=RecordID+1
をキーにLeft Joinします。
これで、会員IDごとに1行上にずらしたデータを結合し取得することができます。
Left Joinなので、各会員IDの先頭行のRight側のデータにはnullが入ります。
Left Joinしたままの結果だと不要な列もあり見づらいので、最後に後処理をします。
【Step4】後処理をする
次の処理をしてデータを整えます。
・不要列を削除する
Right側(Step2の結果)のいらない列は削除します
・列名を変更する
Right側(Step2の結果)の購入日を「前回購入日」にリネーム
・会員IDごとに並び替える
これはやらなくてもよいですが、結果を見やすくするため、RANK()関数を利用してソートします。
後処理をした結果がこちらです。
前回購入日に1レコード前の購入日が取得できています。
最初に提示した期待結果とも一致しているので、これで完成です!
Tableau(本体)のみを使っていた頃は、RANK関数は「順位を求める関数」くらいにしか思っておらず
私個人としてはそれほど使う機会がなかったのですが、
Tableau PrepではRANKがないとやっていけないよ・・・というくらい多用しました。
(共感していただける方がいらっしゃれば嬉しいです!)
truestarはマーケティング及びデータ分析の経験と技術を生かしたコンサルティングサービスを強みとしています。
当社のサービスにつきましては、こちらのお問い合わせフォームからお気軽にご相談ください!