こんにちは!truestarのtokuです。
今回はTableau Prepでグループ化をした際に、デフォルトの機能ではグループキーに対して集計はできても文字列を結合することはできません。
(最初の値などは選択可能)
実際は以下イメージ図のような動作を行いたい機会は多いかと思います。今回はそのやり方を説明します。
1.概要
今回は以下のサイトを参考にしたので先に記載しておきます。
参考サイト:https://technowhisp.com/tableau-prep-aggregating-strings/
またこのサイトに添付されているprepのWFを使用しますので、ページ下部の「Please download the packaged flowfile to play around with this flow.」から
ダウンロードをお願い致します。
2.手順
データは以下のようになっており、Employeeでグループ化し、該当するWork Dayを「,」で結合したいとします。
2-1.ROW_IDを付与する
まずは上記画像の「Convert ROW_ID」まで説明していきます。
まず元データ対してクリーニングステップを挟み、「グループ化するキー」と「結合する文字列」だけに絞り込みます。
今回のデータは最初から、
○グループ化するキー:Employee
○結合する文字列:Work Day
のみになっているので問題ないですが、普段はもっと多くのカラムがあると思うのでクリーニングステップで整理してください。
その後、ダミーステップを1つ作成し、全く同じデータをジョインします。
その際の結合キーは
グループ化するキー = グループ化するキー
結合する文字列 >= 結合する文字列
に設定します。
その結果以下のようになり、一通りの組み合わせが確認できます。
ついでに一番右のWork Dayの名称をROW_IDに変更しておくと後がわかりやすいです。
次にグループ化を行います。
ROW_IDはカウントにすることで、何番目のWork Dayかがわかります。
例えばJohnの場合、アルファベット順でMONが1番目、TUEが2番目、WEDが3番目に現れることを示しています。
つまり、Johnをグループ化したとき、Work Dayは3つ結合しないといけないことがわかります。
最後にROW_IDの列の文頭に「F」を付けてください。
式:"F" + STR([ROW_ID])
2-2.dummy_headerを用意する
今回、ダミーのテキストファイルを用意する必要があります。
中身は以下のようにROW_IDを記載しただけのもので大丈夫です。
ここの意図ですが、ここに記載されているROW_IDの数(画像でいうと10)が、
結合できる文字列の最大数になります。
そのため、2-1でROW_IDを作成しましたが、そのROW_IDの最大数以上をこのdummy_headerに記載するようにして下さい。
もし、上記の画像のように10個記載している状態で、10個以上結合する必要が出てきた場合は、
11個目からは結合されずに出力されます。
2-3.文字列を結合する
まずはdummy_headerをユニオンします。
その後、Table nameフィールドは不要なので削除してください。
続いてピボットテーブルを使用します。
①ピボットされたフィールドの「列から行」を「行から列」に変更します。
②そして上側にグループ化するキー、下側に結合する文字列のフィールドを「MAX」で配置します。
最後にクリーニングステップで処理を行います。
①グループ化するキーのnullを除外
②計算フィールドを作成
F1以降は基本的にdummy_headerに記載した分だけ繰り返して置くといいかと思います。
式:IIF(ISNULL([F2]),"",","+[F2]) →赤色のカンマの部分を変更することで文字列を結合する際の区切り文字を指定可能です。
③最後に必要なフィールドだけ保持します。
3.グループ化するキーが複数の場合
今回はグループ化するキーが1つでしたが、3つのキーでグループ化したいケースなどはあるかと思います。
その際は
①すべてのキーを&などで結合して1つのキーにする
②最後にキーを正規表現(REGEXP_REPLACE)など使用して3つに戻す
上記のような操作をしていただければ問題なく機能します。
まとめ
いかがでしたでしょうか。
いずれ文字列のグループ化機能も実装されそうな気もしますが、すぐ利用したい方は参考にしてください。
またtruestarではデータ活用に関する様々な業務を承っております。是非こちらからご相談ください。