
Tableau Prepで1レコード上のデータを取るにはどうしたらよいでしょうか?
AlteryxではMulti-Row Formulaでできるのですが、Tableau 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では様々なデータ分析業務を承っています。こちらからぜひご相談ください。