Tableau PrepをSQL文に変換してみた! GUIツールとコードを自由に行き来出来る未来を目指して。
まえがき
Tableau Prepの操作中に、作業の内容を最終的に一括でSQLに変換できること、またはSQLの内容を一括でタブレット上で視覚的に表示できることについて、これがどれほど業務を容易にするかについて思いを馳せたことはありませんか?私はよくそう思います。
最近、私はChatGPTを非常に頻繁に使用しており、仕事には欠かせないツールとなっています。さらに、ChatGPTでは添付ファイルのアップロードが簡単にできるようになり、マシンラーニングの知識がなくても利用できるのが大きな利点です。
「あれ、Tableau PrepのSuperstoreデータセットを用いて、SQLへの変換処理を学習させることができるのではないか?」と興味を持ちました。
その後、実際にTableau PrepのファイルをChatGPTにアップロードし、その内容から学習させることで、Tableau Prepで実行されている処理をSQLファイルに変換できないかという挑戦をしてみました。
本チャレンジの意義
現代のツールに関して:
GUIベースのツール
利便性が高い。処理後のコードへの変換が難しい。
コードベースのツール
管理が効率的。すべてをGUIで表現するのが難しい。
相互連携の課題
これらのツール間の機能連携は困難。
ChatGPTの可能性
GUIベースとコードベースのサービスを相互に補完しあう可能性がある。
そんなチャレンジです!
結果、できました。
できました!お疲れ様!Chat GPT。
WITH
-- 各地域の注文データを統合
Combined_Orders AS (
SELECT 'EMEA' AS 地域, * FROM Orders_EMEA
UNION ALL
SELECT 'USCA' AS 地域, * FROM Orders_USCA
UNION ALL
SELECT 'APAC' AS 地域, * FROM Orders_APAC
UNION ALL
SELECT 'LATAM' AS 地域, * FROM Orders_LATAM
),
-- 返品データ
Returns_Data AS (
SELECT *
FROM Returns
WHERE 返品 = 'Yes'
),
-- データ変換(例: 特定の列の削除、データ型の変更など)
Transformed_Orders AS (
SELECT 地域, オーダー ID, 製品 ID, 売上 * 1.1 AS 税込売上, ... -- 他の必要な列
FROM Combined_Orders
),
-- 売上と返品理由を結合
Sales_Returns AS (
SELECT a.*, b.返品理由
FROM Transformed_Orders a
LEFT JOIN Returns_Data b ON a.製品 ID = b.製品 ID
),
-- 販売目標と実売上を比較
Quota_Sales_Comparison AS (
SELECT a.販売員, a.目標売上, SUM(b.売上) AS 実売上
FROM Quota a
JOIN Transformed_Orders b ON a.販売員 = b.販売員
GROUP BY a.販売員, a.目標売上
),
-- 最終的な結果セット
Final_Output AS (
SELECT a.*, b.目標売上, b.実売上
FROM Sales_Returns a
JOIN Quota_Sales_Comparison b ON a.販売員 = b.販売員
)
SELECT *
FROM Final_Output;
またプロンプト、というか私が何に格闘記録を共有します。
Tableau Prep ZIPファイル解読 (openai.com)
今回のChat GPT処理で感じたこと
今回の結果、を受けて結構色々な知見を得ました。
その中身について、記録の意味を込めて書いていきます。
最初にデータの中身を全て理解させる。
これ of これ。Tableau Prepのパッケージドファイルは、実態はZipファイル。Zipファイルに入っているフォルダ、ファイルの存在をすべて認知。
またその中で最初に実行するべきは、「データ」の学習としました。これは、どんな構造のデータを扱ってもらうか定義してもらう為です。
目的を伝えた上でなんの情報が必要が必要か考えてもらう。
彼かは知らないけど。情報を読み取った上で、彼自身に目的を伝えます。
そしてどんな依頼が目標達成に適切かを考えてもらってます。
全体概要の理解、ステップの理解を分割する
詳細は省きますが、今回大事なことは「Node」と呼ばれるものをきちんと理解すること。でした。
FlowにはどんなJsonファイルが存在するか理解してもらう。
ノード構造を理解しつつ、彼に何が必要かを判断してもらっています。
ノードを理解してもらいそこでやっている処理を書き出してもらう
※ここまで来たら既にSQLはできそうだなぁーと思ってました。
Chat GPTは自分の処理の限界まで頑張れない
おー!じゃあ、それぞれのNodeからSQL生成できる、と考えます。
「じゃあ全部SQLにして!」「私の能力ではできない」
うーん・・・そしたら一個ずつTaskを終わらせる、それに対して報酬を付与する、行けるじゃん!みたいに伝える。
結果、19個のNodeがSQLファイルとして生成されます(コメントアウトも自動生成してくれるの嬉しいな…)
-- データの読み込み
SELECT * FROM Orders_EMEA;
-- データの変換とクリーニング
SELECT オーダー ID, オーダー日, 製品 ID, ... FROM Orders_EMEA;
-- データの結合
SELECT a.*, b.* FROM Orders_USCA a JOIN Orders_EMEA b ON a.オーダー ID = b.オーダー ID;
-- データの集計
SELECT 製品 ID, SUM(売上) AS 合計売上 FROM Orders_EMEA GROUP BY 製品 ID;
-- 列の追加
SELECT *, 売上 * 1.1 AS 税込売上 FROM Orders_EMEA;
-- サブクエリを利用した集計
SELECT a.*, b.平均売上 FROM Orders_EMEA a JOIN (SELECT カテゴリ, AVG(売上) AS 平均売上 FROM Orders_EMEA GROUP BY カテゴリ) b ON a.カテゴリ = b.カテゴリ;
-- 条件に基づく選択
SELECT * FROM Orders_EMEA WHERE オーダー日 BETWEEN '2021-01-01' AND '2021-12-31';
-- テーブル間の左結合
SELECT a.*, b.返品理由 FROM Orders_EMEA a LEFT JOIN Returns b ON a.製品 ID = b.製品 ID;
-- 複数条件のフィルタリング
SELECT * FROM Orders_EMEA WHERE カテゴリ = 'Furniture' AND 売上 >= 500;
-- 結果セットの限定
SELECT * FROM Orders_EMEA ORDER BY 売上 DESC LIMIT 10;
-- データのエクスポート
CREATE TABLE Processed_Orders AS SELECT * FROM Orders_EMEA WHERE 売上 >= 500;
そう出来るんだよね、ChatGPTさん。この辺り私のプロンプトの作り方の問題かもしれないけど…なんか人間とChatGPTの共存だなぁって思うと共に。
私達人類が、誰かと働く。ってこんな感じなんだろうな、と感じました。
最終的にSQLが一つになる
なりました。もちろん、こう書いたほうがいいよね。はある。
ただ書き上げたのは相当偉い!Great Job!
WITH
Temp_Orders_EMEA AS (
SELECT * FROM Orders_EMEA
),
Temp_Orders_USCA AS (
SELECT * FROM Orders_USCA
),
Temp_Returns AS (
SELECT * FROM Returns
),
Combined_Orders AS (
SELECT a.*, b.*
FROM Temp_Orders_USCA a
JOIN Temp_Orders_EMEA b ON a.オーダー ID = b.オーダー ID
),
Aggregated_Orders AS (
SELECT 製品 ID, SUM(売上) AS 合計売上
FROM Temp_Orders_EMEA
GROUP BY 製品 ID
),
Avg_Sales AS (
SELECT カテゴリ, AVG(売上) AS 平均売上
FROM Temp_Orders_EMEA
GROUP BY カテゴリ
),
Selected_Orders AS (
SELECT *
FROM Temp_Orders_EMEA
WHERE オーダー日 BETWEEN '2021-01-01' AND '2021-12-31'
),
Left_Join_Orders AS (
SELECT a.*, b.返品理由
FROM Temp_Orders_EMEA a
LEFT JOIN Temp_Returns b ON a.製品 ID = b.製品 ID
),
Filtered_Orders AS (
SELECT *
FROM Temp_Orders_EMEA
WHERE カテゴリ = 'Furniture' AND 売上 >= 500
),
Limited_Orders AS (
SELECT *
FROM Temp_Orders_EMEA
ORDER BY 売上 DESC
LIMIT 10
)
-- 最終的な結果を新しいテーブルに保存
SELECT *
FROM Filtered_Orders;
以上です
どうでしたか?次回以降もう少しチャレンジすると…GPTsでTableau PrepをすべてSQLファイルに変換する仕組みが作れそう。すごい。
あとはTableau Prepってどんな処理が出来るのか学習させることで、より制度は増しそうだな。と。
要望あれば作るかもしれません…(いいね押して待っておいてください)
またJsonファイルについてChatGPTに山程学習させれば、SQLからJsonファイル生成できそうとも感じました。
つまり、複雑なSQLを一つひとつのノードになおす。それをJsonファイルに変換するという手順を踏めば、Tableau Prepは機能できる。
本当にすごい世の中になりました。
またぜひGUIサービス提供している方は、コードツールとの総合連携をご検討頂けますと幸いです。