【Tableau Prep】1行上のデータを取得する方法 RANK関数とJoinの合わせ技

【Tableau Prep】1行上のデータを取得する方法 RANK関数とJoinの合わせ技 | Tableau-id Press -タブロイド-
Tableau Prep

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はマーケティング及びデータ分析の経験と技術を生かしたコンサルティングサービスを強みとしています。
当社のサービスにつきましては、こちらのお問い合わせフォームからお気軽にご相談ください!