Tableauには便利な関数が豊富に用意されている一方、「この関数は何のために使うのか?」と疑問に感じる関数もしばしば…。
その代表格とも言えるのがPREVIOUS_VALUE関数ではないでしょうか。今回は、そんなPREVIOUS_VALUE関数の意味を解説すると共に、具体的な活用シーンをご紹介します。
本ブログを最後まで読んでいただければ、謎が多かったPREVIOUS_VALUE関数の便利さに気づくと共に、今まで解決出来なかった問題をPREVIOUS_VALUE関数を用いて解決する糸口が発見できるでしょう!
PREVIOUS_VALUE関数の概要

PREVIOUS_VALUE関数の定義
最初にPREVIOUS_VALUE関数の定義を確認します。
公式ヘルプの定義は下記の通り。
前の行のこの計算の値を返します。現在の行がパーティション内の最初の行の場合は、指定された式を返します。
例
SUM([Profit]) * PREVIOUS_VALUE(1) は SUM(Profit) の累積積を計算します。引用:Tableau公式ヘルプ
この説明では非常にわかりづらいので、かみ砕いて言うと
表計算を行う際に、
- 最初の行は指定された値を基に計算を行う
- 2行目以降は1行前の値を基に計算を行う
という定義になると考えています。
言葉だけではイメージがつかないと思いますので、実際の挙動を確認してみましょう。
PREVIOUS_VALUE関数の挙動
今回は理解促進のため、下記のようなスモールデータソースを使用して挙動を確認していきます。

Tableau上で操作しながら理解を深めたい方は、下記リンクよりデータソースをダウンロードしてください。
上記データをTableauに接続し、下記画像のようなクロス集計表を作成します。

続きまして、PREVIOUS_VALUE関数を用いた計算式を作成します。
その結果をクロス集計表の中に追加して、挙動を確認してみましょう。


上記のように、最初の1行目に関しては「PREVIOUS_VALUE()」の中の「()」内で指定した値(今回は0」が代入されて計算を実行します。そして2行目以降は「PREVIOUS_VALUE()」の値に、前の行の値が代入されて計算を実行します。
実際の挙動を見ていただいたことで
表計算を行う際に
- 最初の行は指定された値を基に計算を行う
- 2行目以降は1行前の値を基に計算を行う
上記の定義に対してイメージを掴めたのではないでしょうか。
PREVIOUS_VALUE関数とLOOKUP関数の比較

続きまして、PREVIOUS_VALUE関数と比較されがちなLOOKUP関数との違いを解説します。今回も先ほど使用したデータソースを用いて、挙動を確認していきましょう。
LOOKUP関数の挙動
最初にLOOKUP関数の挙動を確認していきます。

LOOKUP関数が参照するのは、あくまでもカッコ内で指定した値です。加えて「何行前(後)の値を参照するのか?」についても、オフセットの数値を指定することによって、変更が可能です。
PREVIOUS_VALUE関数の挙動
続いて、PREVIOUS_VALUE関数の挙動を確認していきましょう。

PREVIOUS_VALUE関数の場合、1行目はカッコ内で指定した値を参照します。一方で2行目以降に関しては、1行前の値を参照するため、カッコ内で指定した値は参照されません。
そして、LOOKUP関数のように「何行前(後)の値を参照するのか?」という設定をすることは不可能で、必ず1行前の値を参照するのが特徴です。
PREVIOUS_VALUE関数とRUNNING_SUM関数の比較

続きまして、LOOKUP関数と同様にPREVIOUS_VALUE関数と比較されがちなRUNNING_SUM関数との違いを解説します。今回も先ほど使用したデータソースを用いて、挙動を確認していきましょう。
RUNNING_SUM関数の挙動
最初にRUNNING_SUM関数の挙動を確認していきます。

RUNNING_SUM関数の場合、カッコ内で指定した値を前の行で計算された値に足し上げていく挙動になっています。前の行の値を参照している点、PREVIOUS_VALUE関数と非常に特徴が似ています。
PREVIOUS_VALUE関数の挙動
続いて、PREVIOUS_VALUE関数の挙動を確認していきましょう。

PREVIOUS_VALUE関数の場合、最初の行はカッコ内で指定された値(今回は0)が代入され、それに「SUM(個数)」の値が足し上げられています。2行目以降は、1つ前の行の値に対して「SUM(個数)」の値が足し上げられています。
このように、PREVIOUS_VALUEの最初の値を「0」にすることで、累計を算出することが可能です。RUNNING_SUMと比較すると、挙動は似ているものの、初期値を可変にできる点は大きく異なるでしょう。
【実例】PREVIOUS_VALUE関数の使用場面

ここまでで、PREVIOUS_VALUE関数の概要および挙動について解説しました。PREVIOUS_VALUE関数についてのイメージが徐々に掴めてきたのではないでしょうか。
最後に、私が実際に業務でPREVIOUS_VALUE関数を使ってお題を解決した例をご紹介します。
具体的には、下記の2点です。
- カンマ区切りリストの作成
- N個の空白を飛び越えて数値を参照(歯抜けリストの穴埋め)
順番に見ていきましょう。
カンマ区切りリストの作成
1つ目は「カンマ区切りリストの作成」です。
お題としては、下記の通り。
地域ごとの売上の累積をみたい。そして、どの地域の売上が累積されているのかをカンマ区切りで分かるようにしてほしい。
具体的なイメージは下記画像のようなクロス集計表となっています。

今回は、Tableauユーザーにお馴染みの「サンプルスーパーストア」を用いて実装方法を解説していきます。
手順①:地域ごとの売上を表現したクロス集計表を作成
「地域」を行に「売上」をテキストに配置して、地域ごとの売上を表現したクロス集計表を作成します。

手順②:PREVIOUS_VALUEを用いて「売上」の累計を作成
PREVIOUS_VALUEを用いて、下記のような「売上」の累計を求める計算式を作成します。

作成した計算式をクロス集計表の中に配置してください。

手順③カンマ区切りリストの作成
下記のような計算式を作成してください。

上記の計算式の意味は下記の通り。
- もし、最初の行(INDEX番号が0)であれば、地域の値を返してください。
- それ以外の場合(つまり、2行目以降)であれば、前の行の値(PREVIOUS_VALUE(“”))+「,」+地域を連結した文字列を返してください。
※地域をATTRでくくる理由は、IF文の中で集計・非集計を混同させることができないため。
上記の計算式をクロス集計表の中に配置してみましょう。すると、下記画像のようにカンマ区切りで累計されているディメンションメンバーを表現することができました。

手順④体裁を整える
最後にクロス集計表の体裁を下記のように整えたら完成です。

※「地域」ディメンションを「詳細」に配置しないと、表計算が崩れてしまいます。
N個の空白を飛び越えて数値を参照(歯抜けリストの穴埋め)
2つ目は「N個の空白を飛び越えて数値を参照」です。
お題としては、下記の通り。
売上が発生した日付の売上と、その前に売上が発生した日付の売上の差を見たい。
具体的には、下記のイメージです。

上記のテーブルのように、売上が発生した日付は歯抜けになっている状況です。お題としては、たとえば「2022/11/1」に売上が発生したとしたら、その前に売上が発生した最新の日付、つまり「2021/5/1」の売上の値との差をみたいという意味です。
完成イメージは下記の通り。

それでは、手順を解説していきます。実際に手元で操作しながら理解を深めたい方は、下記リンクよりデータソースをダウンロードしてください。
手順①クロス集計表を作成
まずは、前準備です。下記画像のようなクロス集計表を作成してください。

手順②LOOKUPのオフセットに設定する数値をPREVIOUS_VALUEで作成
最終的にLOOKUP関数を使用して、N個の空白を飛び越えた数値の参照を実現します。
たとえば「2021/11/01」では6行遡れば前売上のあった最新の日付「2021/05/01」にたどりつきますので「LOOKUP(SUM(売上),6)」とすれば、欲しい値を取得できます。「2022/03/01」では4行遡れば前売上のあった最新の日付「2021/11/01」にたどりつきますので「LOOKUP(SUM(売上),4)」とすれば、欲しい値を取得できます。
では、どうすればLOOKUPのオフセットに指定する数値を行によって可変にできるのでしょうか?それは、下記のようなPREVIOUS_VALUEを使った計算式で実現できます。

計算式の意味は下記の通り。
- もし「売上」の値がNULLだったら、前行の値に+1をしてください。
- 値がNULLでなかった場合は、0を返してください。
計算式の結果をクロス集計表に入れてみましょう。

すると、空白の部分に関しては「1, 2, 3, 4 ……..」と数値が数えられており、売上があったタイミングで0に戻っています。
LOOKUPのオフセットで使用する数値は、上記にもう1ステップ加えることで完成します。
手順③1つ上の参照数値を取得して、それに+1をする。
次に、手順②で作成した「参照数値」をLOOKUP関数で取得します。
具体的には、下記計算式のとおり。

計算式の意味は下記のとおり。
- もし、売上がNULLでなかった場合は1行遡った「参照数値」の値を取得して、それに+1をしてください。
- その他の場合は、NULLを返してください。
計算式をクロス集計表の中にいれて確認してみましょう。

見事に売上がある行に対して、その前の売上がある行をLOOKUPで遡るための数字を取得することに成功しました。
手順④「前売上」を手順③で作成した数値をオフセットに設定し、LOOKUP関数で取得する
最後に、LOOKUP関数のオフセットに手順③で作成した数値を設定して「前売上」を取得しましょう。
下記の計算式を作成してください。

上記をクロス集計表に加えた結果がこちら。

このように、売上がある行に対して、その前の最新売上を取得することができています。
最後に、その月の売上と前売上の差を求めましょう。


上記の通り、お題をクリアすることができました。
まとめ
本記事では、TableauのPREVIOUS_VALUE関数の機能および具体的な使用例についてご紹介しました。一見「何のために使うの?」と思う関数でも、工夫次第では様々な可能性を秘めていることがお分かりいただけたのではないでしょうか。
弊社のコンサルティングサービスでは、お客様のダッシュボードのご相談に対し、ヒアリングから実装まで一貫してサポートいたします。ぜひお気軽にお問い合わせください。ここまで記事を読んでいただき本当に有難うございます。