見出し画像

Tableau Prepの作業を変えるTips集10 ー結合句(キー項目)が無い場合の結合方法、結合フィールドの不等号利用ー

Tableau Prepユーザー会のNakajima2です。
Japan Preppin Data FamメンバーのPrep Tips集をご紹介します。
今回は第10回目も、結合処理に関する2つのTipsです。

Prep Tips (19) : 結合句(キー項目)が無い場合の結合方法

<初心者〜中級者> 

2つのテーブルを結合処理をする場合、一般的に1つ以上の結合句(キー項目)が存在します。前回のTipsで取り上げた7種の結合タイプも、結合句があることを前提にしています。
そうは言うものの、結合句がないけど2つのテーブルを結合したい、データを横になんとか並べたい! なんて経験されたことありませんか?
対処方法があるんです、そんなTipsをご紹介します。

結合句(キー項目)が無いデータ事例

具体的な事例をご紹介します。
Preppin Data 2024W18の課題から、該当する項を下記に示します。分かりやすくするために、課題の中からこの説明では利用しないフィールドは削除してあります。テーブル1と2で共通な内容となる結合句が無い状況です。

テーブル1 動植物の情報 データ量は326行
テーブル2 動物園所在地の最低、最高気温 データ量は1行

この2つのテーブルを横に並べて! と言うのが課題からの要件でした。
最終的には、Inner結合を用いましたが、そのための前処理がちょっとだけ必要です。具体的には、次の2例を紹介します。

(1)Dummyフィールドを2つのテーブルに作成する

2つのフィールドそれぞれに、Dummyとなるフィールドを作成します。計算フィールドの作成を用いて、次の式を使いました。

Dummyとして[Add 1]  のフィールドを作成。
データは数字の 1 を入れています。
テーブル1に[Add 1]  のフィールドを追加した
結合処理のフロー例

結合処理は、次の通りです。
これで、2つのテーブルのデータが横に並んでることが出来ました。

[Add 1]   でInner結合を行った
結合結果 2つのテーブルのデータが横に並んでいる


(2)2つのテーブルで共通なデータの無いフィールドを利用して結合する

もう一つの方法は、2つのテーブルで同じデータが無いフィールドを利用して結合処理を行う方法です。
Preppin Data FamメンバーのYamaguchiさんからのTipsです。

分かりやすいように、(1)と同じ[Add 1] のDummyフィールドを一つのテーブルに作成し、結合句として処理を行ってみます。

Dummyとして[Add 1]  のフィールドをテーブル2に作成。
データは結合処理での型を合わせるため文字列の 1 を入れています。
結合先のテーブル1内容を確認。
[Name]フィールドを利用するが、1 の文字列が無いことを確認した。

Dummyフィールドを作成した後の結合処理は、次の通りです。
ここでポイントなるのが、結合句の間にある “不等号” の設定方法です。ここではPrep特有の記号 != を利用します。この記号の意味は、”違うもの” になります。一致しないデータ通しで結合してね という処理になります。
これで、(1)同様に、2つのテーブルのデータが横に並んでることが出来ました。

[Add 1]  と [Name]でInner結合を行った
結合結果 2つのテーブルのデータが横に並んでいる

(3)おまけ この作業、実はユニオンでも出来るんです

Preppin Data Famメンバー たっくんさん からのTipsです。
今回の事例、結合を使わないでユニオンでも作業出来ます。Dummyフィールドを作成しない分、手間は少ない感じです。

ユニオン処理のフロー例

ユニオン処理後のデータ状況です。
2つのテーブルからのフィールドは横に並びますが、お互いのテーブルに無いフィールドのデータは NULL になっています。

ユニオン処理後の結果 各フィールドが横に並び NULL が残っている

同じレコード(行)で横(列、フィールド)の方向にデータを並べたいので、[High °C]と[Low °C]のデータをFixed関数を利用して縦方向(全ての行)にデータを入れる(NULLを置き換える)Fill Downの様な処理を行います。

{ FIXED :MIN([High °C])} の計算式で[High °C]を上書き
その後、[Low °C]も同様な処理を実施

Fixed関数での処理後、[Wildlife]などのフィールドで、NULLをフィルタ(除外など)すれば求めたいデータになります。

最終結果 2つのテーブルのデータが横に並んでいる

まとめ

結合句がない2つのテーブルを結合したい、というニーズに対応するTipsです。
意外と利用するケースが出てくるようです。是非、そのケースに遭遇した際に、使いやすい方法で利用してみてください。


Prep Tips (20) : 結合フィールドの不等号利用

<中級者〜上級者> 

これこそ、目から鱗のTipsです。Mr もりた 直伝の数値の大小比較を実施するフィルタ処理も一度にやってしまう処理方法です。
聞けば納得、すごい なるほど! と思えるTipsです。

利用するデータソースの内容

具体的な事例で説明します。Preppin Data 2024W17の課題になります。
この課題は、次の要件が示されていました。

  1. スーパーマーケットの予実対比のデータ前加工

  2. Category毎に年間予算(テーブル1)と月の販売実績(テーブル2)データが与えられている

  3. Category毎に年単位で予実を対比。予算より実績が上回っているCategoryのみを抽出する。

  4. 3項に該当する年単位で予算より実績が上回っているCategoryの中で、月単位で予実を対比。最も予実の差が大きいCategoryのみを選ぶ。

一般的な結合処理(Inner結合)

一般的な結合フロー例 ②、③の抽出処理は、結合処理後のクリーニングステップで実施

一般的な処理方法は、
 ①予算(テーブル1)と実績(テーブル2)を結合してデータを横に並べて
 ②年単位で予算より実績が上回っているCategoryを抽出し
 ③月単位で予算より実績が上回っているCategoryをランク付けして抽出する
作業を順に行うことになります。順に次の処理フローを作成します。
 ①結合処理(Inner結合など)
 ②データ抽出(大小比較でのフィルタ処理、条件式作成など)
 ③データ抽出(大小比較でのフィルタ処理後のランク作成など)

①でのInner結合の処理内容 結合句は[Category]
②年単位のデータ抽出例
③月単位のデータ抽出後 ランク付け処理例

不等号を利用して結合させる、合わせてデータ抽出も実施

今回のTipsでは、①、②、③を一つの結合処理で一気に行うことが出来ます。全体のフローは次の通りです。

不等号を利用した結合のフロー ぱっと見は差がわかりませんが
クリーニングステップで集計処理は行なっていない

具体的な結合処理での設定内容は、次の通りです。
 ①Inner結合の処理内容 結合句は[Category] : これは一般的方法と同じ
 ②年単位データ抽出を[Annual Spending] > [Annual Budget]の結合処理で
 ③月単位のデータ抽出を[Actual Spending] > [Budget]の結合処理で
複数の結合句での結合処理として実現しています。下図を参照ください。

①でのInner結合と、②年単位データ抽出比較、
③月単位のデータ抽出を3つの結合処理で実現

この結合処理にて、その後のクリーニングステップでの抽出(フィルタなどを利用)する処理は実施してなく、フロー全体の処理数も減らすことが実現出来ています。
③のランク付け処理はクリーニングステップで個別設定が必要ですが、クリーニングステップ内の処理数は大幅に減り、フロー作成作業の手間とフローの処理速度向上にメリットがあると考えられます。

まとめ

結合処理時に不等号を利用することで、フィルタ、抽出処理も合わせて行えるTipsです。使い出があると思います。
今回例題としたPreppin Data 2024W17については、Preppin Data Famメンバーの勉強会動画(2024年5月)でも取り上げており、不等号を利用した結合処理の詳細説明はそちらの動画もご覧頂ければ、更に使い方の勘所などもお分かり頂けると思います。


いいなと思ったら応援しよう!