Text-to-SQL

by

in

 昨日、とあるリモート会議で前回の記事に類するお話をしたところ、出席者から「この SQL は AI で生成できるかな」との発言がありました。
 調べたところ「Text-to-SQL」と言って、こういった事は昨今ごく普通に行われている模様。という訳で、何となくこれまで避けてきた生成 AI にトライしてみることにした。
 ChatGPT は新規ユーザー登録が必要なのでパスして、今回お世話になったのは Gemini(チームみらいの安野氏が「ジェミナイ」と発音していた)。選択したモデルは「推論・数学・コーディング」向けの 2.5Pro。

 前回の課題に則して投げた質問は以下。

日別の雨量データ rainfall.csv があります。1 カラム目の date は日付文字列、2 カラム目の value は実数型の 1 日雨量です。レコードは date でソート済みです。
SQLite で rainfall.csv を rainfall テーブルに展開したうえで 1 日、2 日、3 日の連続雨量の最大値を年別に抽出する SQL を生成してください。

 回答で得られた SQL は以下の二つ(実際は解説付きなので興味がある方は同じ質問を投げて確認されたい)。

-- rainfall テーブルの作成
CREATE TABLE rainfall (
  date TEXT PRIMARY KEY,
  value REAL
);

-- (SQLiteのコマンドラインツールで以下を実行)
-- .mode csv
-- .import rainfall.csv rainfall
WITH ConsecutiveRainfall AS (
  SELECT
    strftime('%Y', date) AS year,
    value AS one_day_rainfall,
    -- 2日連続雨量 (当日 + 前日)
    value + LAG(value, 1, 0) OVER (ORDER BY date) AS two_day_rainfall,
    -- 3日連続雨量 (当日 + 前日 + 前々日)
    value + LAG(value, 1, 0) OVER (ORDER BY date)
          + LAG(value, 2, 0) OVER (ORDER BY date) AS three_day_rainfall
  FROM
    rainfall
)
SELECT
  year,
  MAX(one_day_rainfall) AS max_1_day_rainfall,
  MAX(two_day_rainfall) AS max_2_day_rainfall,
  MAX(three_day_rainfall) AS max_3_day_rainfall
FROM
  ConsecutiveRainfall
GROUP BY
  year
ORDER BY
  year;

 WITH 句LAG 関数の利用など前回の SQL と異なるものの(こちらの方がベター?)内容は同一。新たなテーブル・フィールドの命名も適切。正常動作も確認された。

 以上、Text-to-SQL は非常に役立つ
 しかしながら、結局、AI の回答の当否を判断するのは人間なので、AI との協業というのが正しいスタンスなのだと思う。つまり当方も学習の強化が必要だ。