Skip to main content

初歩的な質問だったら申し訳ありません。​

タイトルの通り、DateSaberのord8についての質問なのですが、Q8にて、​配布されているデータと解説動画のデータに微妙に差があるため、大元と同じ見た目にしたく色々弄っております。

差と言っても大した部分ではなく、データが2013~2016で色分けされているかされていないかだけです。

​ただ、この差に使用される関数がよくわからなかったので教えていただきたいです。

動画:https://youtu.be/0pg41F9P1Q8?t=5649

動画を見た限り、MIN(YEAR([オーダー日]))で​色の調整をしているようなのですが、MINを使用する理由が知りたいです。

年だけなら、YEAR([オーダー日])だけで出せないだろうかと思って試してみたところ、YEAR(DATETRUNC('quarter', [オーダー日]))と自動変換されて長くなってしまったため、短縮させるためにMINを使用しているのでしょうか?(MINを使用することでDATETRUNC('quarter',〜の部分が短縮できる理由もよくわかっていないのですが…)

恥ずかしながら、MINは最小値を返す関数という認識だったため、年を表現する際に使用する理由がよくわからず質問させていただきました。

すみませんが、どなたかお分かりになりましたら教えていただきたいです。​

DateSaberのord8,Q8の関数について

3 respostas
  1. 5 de abr. de 2023, 09:37

    試験問題なのでどこまで答えていいのか分かりませんが、​設問に直接言及する部分ではなさそうなのでその範囲で解説します。

    結論だけ先に書くと、「集計値にしておくと表計算に影響を与えず都合が良いから」です。​

    MIN関数には2つの用法があり、それぞれで集計値になるか非集計値になるかが変わります。

     MIN(arg1, arg2) → 引数を2つ取るときは非集計値

     MIN(arg1) →引数が1つのときは集計値

    試験問題なのでどこまで答えていいのか分かりませんが、​設問に直接言及する部分ではなさそうなのでその範囲で解説します。​結論だけ先に書くと、「集計値にしておくと表計算に影響を与えず都合が良いから」です。​​MIN関数には2つの用法があり、それぞれで集計値になるか非集計値になるかが変わります。 MIN(arg1, arg2) → 引数を2つ取るときは非集計値 MIN(arg1) →引数が1つのときは集image

    今回は MIN(YEAR([オーダー日])) なので引数がひとつ​で集計値になります。

    なぜこんな話をするかというと、非集計と集計ではTableauの計算上の扱いや他の計算に与える影響が異なるためです。​

    Tableau の操作の順序 - Tableau

    表計算での値の変換 - Tableau

    Tableauにおいて非集計値はディメンションとなります。「YEAR([オーダー日]) ではだめなのか」というご質問ですが、この YEAR([オーダー日]) は非集計値なのでディメンションです。ディメンションであるということは、上述のリンク先にあるように表計算に影響を及ぼしてしまいます。

    image

    冒頭の「詳細レベルのすべてのディメンションを使用する必要があります」とは、裏を返せばビュー上にある全てのディメンションは表計算に何らかの影響を及ぼすという意味です。今回添付いただいたキャプチャを見ると列の売上は表計算が使用されています。ここに非集計の年を入れてしまうと表計算が崩れます(再設定が必要になったり、場合によっては望む結果を得られなくなります)。

    非集計だと表計算にとって都合が悪いので集計値として扱おうということでMINをかけているわけです。なぜならば集計値であれば表計算に影響はない​からです。表計算の編集画面を出してみれば分かりますが、区分と方向を指定する欄にはビュー上の集計値のフィールドは選択肢として出てきません。集計値は表計算に影響を及ぼさないので何も設定したり操作したりする必要がないのです。

    ビュー上には行に日付値としての四半期(2016 Q2のような)​があります。全ての集計はこの粒度を含む状態で行われますので、 YEAR([オーダー日]) の結果はMINをかけようとかけまいと同じ値が出ます(2016 Q2 であれば「2016」)が、MINをかけずに非集計のままだと前述のように表計算が崩れますので、表計算を再設定しなくて済むようにMINをかけて集計値として扱うようにしていると考えられます。

    「DATETRUNC('quarter', ...)​ を短縮するためなのか」という疑問に対しては、これは個人的にはNoだと思います。年を取り出すために先に四半期単位に集約するというステップを挟む必要はそもそもありません。

     YEAR([オーダー日])​ → オーダー日という日付データから年を取り出す(2016年3月15日は2016が返ってくる)

     DATETRUNC('quarter', [オーダー日])​ → オーダー日を四半期の初日に揃える(2016年3月15日は2016年1月1日になる)

     YEAR(DATETRUNC('quarter', [オーダー日]))​ → 四半期の初日に揃えてから年部分だけを取り出す(2016年3月15日はまず2016年1月1日になり、2016年1月1日から2016が返ってくる)

    最後の下線部分を見るに、途中で四半期に集約する意味はありません。​集約してもしなくても結果が同じだからです。結果が同じになる場合、余計な関数を挟むと(理論上は)計算速度が遅くなるデメリットしかありません。

0/9000