見出し画像

RUNNING_SUM と SUM()+PREVIOUS_VALUE(1) が(当たり前だけど)全く別物だった話

こんにちは。Hitomiです。

今日Ord.9を終え(passしたかは定かでない)、残すところOrd.4&10になりました。鬼門を残してしまいました!!!!Ord.4に関しては何回提出したかわかりませんマジで

掲題の通り今回は、Ord.9でわかったRUNNING_SUM() とSUM() + PREVIOUS_VALUE(1) の違いについてまとめていきたいと思います。
だらだらと書いてしまった気がするので一言で内容をお伝えすると、IF文で使用するとRUNNING_SUM() と SUM()+PREVIOUS_VALUE(1) とじゃあ全然挙動が違うよ!という話です。
最後までお付き合いどうぞよろしくお願いします。

RUNNING_SUM() とは? 

まずTableauの公式解説を見てみましょう

画像1

まあシンプルに指定した式を左から右へどんどん足してくれる、つまり累計を返してくれるという話ですね!うんうんめっちゃわかる。

では SUM()+PREVIOUS_VALUE(1) とは?

その行の合計に何やら過去の値を足してくれるもの...?こちらも公式の解説を見てみましょう。PREVIOUS_VALUE()の解説になります。

画像2

「前の行のこの計算の値を返します。」...なるほど、その行のSUM(profit)にその前の行のSUM(profit)+PREVIOUS_VALUE()を足す感じですかね。必ず前の行の値を参照しながら計算が行われるようです。
実際にTableauのシートで確認してみましょう。

実際に変わらないのか?確認してみる

実際にどちらも類型になってるのかを確認してみました。使用したのはサンプルスーパーストアです!

RUNNING_SUM()を作ります

画像4

そしてSUM+PREVIOUS_VALUE()を作り...

画像3

カラムにMONTHを入れてみました

画像5

うん、一致してるっぽい。

というわけでここまでだと「なんでPREVIOUS_VALUE()使って累計出すの?普通にRUNNING_SUM()使えばよくない??」となるのですが。というか私はなっていたのですが!!今回のOrd.9でこのPREVIOUS_VALUE()の真の力が解禁されました。さながら卍解の気持ちです。

RUNNING_SUM() の失敗と PREVIOUS_VALUE(1) との出会い

まだOrd.9に挑戦されてない方にはネタバレになってしまうのですが、Ord.9のQ.11で「ある一定の値(閾値)を超えた値だけを累計してね」という問題が課されます。で、その時に私は安直に(あ~~~じゃあIF文で一定の値を超えた場合の累計すればいいってことねおk~~~)と思いこんな構文を書いたわけです↓

画像6

もちろん構文自体にエラーは出ませんでした(閾値超えは「SUM([売上])>[閾値]」、売上超過分は「SUM([売上]) - [閾値]」です)。いやもうこれで無事クリアですわ、と余裕をかましながら行に追加すると...

画像7

私(え、なんかめっちゃマイナスなんだけど...思ってたんと違う...)
そうなんです、間違っていたんですね...。この計算だと、閾値を越していないものは0で返してくれているんですけど、結局閾値を超したオーダーの週では(閾値を下回っている)これまでのすべての週の売上をSUMしている状態になってしまっているんです。。。
で!もうここまでお付き合いくださった方はお分かりだと思いますが、ここで救世主が登場するわけです。

PREVIOUS_VALUE()!!!!!

いろいろググったり(師匠のデータをチラ見したり)しながらどうやらPREVIOUS_VALUE() を使って累計を出してあげるといい感じになるらしいということが分かってきました。
そこでこんな感じで書き直してみると...↓

画像9

ジャーーーン!

画像9

できた!!!!!!やったね!!!!!
でもなぜさっきのただの表計算関数ONLYの時はRUNNING_SUM()もSUM()+PREVIOUS_VALUE(1) は同じ挙動だったのに、今回は違うのでしょう...。答えはIF文に隠されていたようです。

IF文に組み入れられた時、効果を発揮する

今回のOrd.9 Q11では、「ある一定の値を超した値""だけ""を累計してね」という指示でした。ここでPREVIOUS_VALUE()の公式解説を振り返ってみましょう。

画像10

このPREVIOUS_VALUE()関数は「前の行のこの計算の値を返します」、つまりIF文で指定している様々な条件を考慮した累計が可能になる、ということになります。RUNNING_SUM()ではできない、様々な条件を前の行に引き継ぎながら累計を算出できるということですね。

今回の問題で言うならば、「ある一定の値を超してるときには「売上が超過している行」の前の行の売上超過分の値を足していくよ、ある一定の値を超していなければ0で返すよ」という構文になっていたのです。

いかがでしょうか。RUNNING_SUM()とSUM()+PREVIOUS_VALUE(1)の挙動の違いを何となくでも理解していただけたでしょうか。
私自身まだまだ勉強中の身なので間違いなどあったら教えていただけると嬉しいです!
読んでくださりありがとうございました。

この記事が気に入ったらサポートをしてみませんか?