やりたいことは、例えばビッグデータを格納したDatabaseにアクセスして、前日のKPI(Key Performance Indicator)から対象を絞る。その対象だけ先週いっぱいのKPIを取得したい。この時、クエリを動的に書き換える必要がありますが、
(1) Dynamic InputツールにはクエリのWhere句の中身を書き換える機能がある
(2) しかし、Whereが複数条件の場合に選択できない
(3) そこで、文字列の置換機能を利用してWhere ~ in ()内に条件を埋め込む
(4) しかし、動的な文字列の結合がAlteryx純正ツールではうまくできない
このような問題があるのです。もう少し単純な例で示すと、
Select name from 廃涸村 Where 体力 > 10000
の様なクエリから以下のような表を吐き出し、
name
太郎
次郎
三郎
→Select * from 家族構成一覧 where name in ('太郎', '次郎', '三郎')
このようなクエリを作りたい場合、対象が3つと分かっているならばFormulaツール等で簡単にできますが、クエリの結果なので毎回変化します。標準ツールを色々と試してみましたが、結局Rツールでコードを書く方法しか見つかりませんでした。
全体図を下に示し、各ツールの動作について解説します。
Input Data & Select
ここで前段階のクエリ結果(Dynamic Input & Selectを使用)や、Excel/CSVファイルから対象リストを読み込みます。Unique
リストの重複を省きます。Unique Fieldsでキーとなる項目を選択します。後記シングルクォーテーションの追加も含めて、Rツールでも処理が可能ですが、なるべくコードはシンプルにしたかったので…(一応コードフリーのツールだからね)。Formula
今回はWhereで絞るのが文字列だったので、シングルクォーテーションで囲みます。Output Column : my_id
Formula : "'"+[my_id]+"'"
R Tool
R言語ツールはタコ足の形をしています。多入力多出力が可能で、コード内でどの入出力かを選択・処理します。これが最初分からなかった。何か特別な出力項目が5個あるの?と思ってしまって。コードは以下。ids <- read.Alteryx("#1", mode="data.frame")
write.Alteryx(paste(ids[,1], collapse = ","), 1)
1行目:変数idsに、#1のインプットからデータを取得します。#1の文字は分かりやすい文字に変えることができます。
2行目:idsの1列目[,1]をpaste関数で結合し、コンマ区切りにして、1へ出力します。
全データの結合は、Multi-Row Formulaだと前後数行としか結合できず、Cross Tabで横並びにした後に結合する方法では、固定列数しか処理できません([column1] + [column2] + [column3])。
2019/7/9 Update!!
R Toolで出力する時、上記のように項目名を指定しないと、自動で項目名が付けられてしまいますが、この後のDynamic Renameではそれに追従してリネームできないことが分かりました。よって、Rの中で項目名を明記しないと次に繋がりません。
id_read <- read.Alteryx("#1", mode="data.frame")
id_pasted <- paste(id_read[,1], collapse = ",")
names(id_pasted) <- c("enodeb_id_list")
write.Alteryx(id_pasted, 1)
変数名を分かりやすくしています。names(id_pasted) は id_pasted の項目名一覧を表し、ここに c("columnName") を入れることで項目名が変わります。今回は1列のみのテーブルなので一つの列名のみですが、複数の場合は c("columnName1", "columnName2", ...) などと指定します。
Dynamic Rename
Dynamic Input
ここで、クエリを指定してデータベースから情報を取得します。今回は、Where ~ in ()のカッコ内を置換することで、動的に対象を変化させます。ODBC Database
Table or Query : Select * From my_table Where user_id in (ID_LIST)
オプションで文字列の置換を指定、ID_LIST部分にRツールで作成した対象リストを入れます。
Modify SQL Query - Replace a Specific String
Text To Replace : ID_LIST
Replacement Field : my_id_list
Text Input & Formula & Append Fields
こちらはExcel形式のファイル名に日付を追加するTipsです。「パス~ファイル名|||シート名」と指定しなければならないので、Append/Prependで日付を追加する方法が分かりません(不可能?)。そこで、Formulaで直接作ってAppend Fieldsで項目追加した後に、Output ToolでTake File/Table Name From Fieldにチェック、Change Entire File Pathを選択し、Fieldにその項目を指定した方が、フレキシブルに設定できます(例えば、ファイル名に日付を入れて、対象ごとにシートを分ける等)。パスは相対パスを指定していますが、ファイルシステム関数でInputファイルの親フォルダを取得、なんてことも可能です。Formula :
'.\' + DateTimeFormat(DateTimeNow(),'%Y%m%d_%H%M')
+ '_kpi_output.xlsx|||KPI'
(時分まで含めれば、1分以内で繰り返さない限り、ファイルの重複は発生しない)
0 件のコメント:
コメントを投稿