【Tableau Prep】1行上のデータを取得する

【Tableau Prep】1行上のデータを取得する | Tableau-id Press -タブロイド-
Tableau Prep

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では様々なデータ分析業務を承っています。こちらからぜひご相談ください。