DuckDBによるSQLクエリ
SQLを使用してスプレッドシートデータと外部データベースを照会する
概要
ModelMonkeyにはDuckDBを搭載したSQLエンジンが内蔵されており、スプレッドシートデータに対して直接SQLクエリを実行できます。また、外部データベース(PostgreSQL、BigQuery)を照会したり、複数のソースにまたがるデータを結合したりすることも可能です。
この機能は、データ変換を正確に制御したい場合、複雑な集計を行いたい場合、または自然言語では明確に表現しにくい方法で異なるソースのデータを組み合わせたい場合に役立ちます。
Tip
SQLを自分で書く必要はありません。やりたいことを平易な言葉で説明するだけで、ModelMonkeyが適切なSQLクエリを生成して実行します。
SQLクエリが使用される場面
リクエストに以下の内容が含まれる場合、ModelMonkeyは自動的にSQLクエリを使用します。
複雑な集計
データのグループ化、合計・平均・件数などの統計演算を多数の行にわたって実行する。
フィルタリングと並び替え
複数の条件に基づいて特定のレコードを検索したり、大規模なデータセットをさまざまな条件で並び替えたりする。
データの結合
スプレッドシートのデータと外部データベースを組み合わせたり、複数のシートをマージしたりする。
データ変換
行ごとの処理が必要な方法でデータを再フォーマット、新しい列の計算、または再構成する。
特定の操作でSQLの精度を優先したい場合は、ModelMonkeyに「SQLを使用して」または「SQLクエリを実行して」と明示的に依頼することもできます。
スプレッドシートデータの照会
スプレッドシートのデータにはsheet_range()関数を通じてアクセスできます。この関数はA1表記の参照を受け取り、照会可能なテーブルとしてデータを返します。
重要な要件
- 指定範囲の最初の行には列ヘッダーが必要です
- 列名はヘッダー行から導出されます
- ヘッダーが空の場合、列名は "column_1"、"column_2" などになります
サポートされる範囲形式
- シート全体:
sheet_range('Sheet1!A:Z') - 特定の範囲:
sheet_range('Sales!A1:D100') - 特殊文字を含む名前付き範囲は自動的にエスケープされます
-- Query all data from a sheet
SELECT * FROM sheet_range('Sheet1!A1:D100')
-- Filter and aggregate
SELECT category, SUM(amount) as total
FROM sheet_range('Sales!A1:E500')
WHERE date >= '2024-01-01'
GROUP BY category
-- Sort by multiple columns
SELECT * FROM sheet_range('Customers!A:F')
ORDER BY region ASC, revenue DESCスプレッドシートクエリの例
外部データベースの照会
外部データ接続が設定されている場合、接続名を使用して照会できます。
PostgreSQL
テーブルはconnection_name.schema.tableとして参照します。デフォルトスキーマは通常 "public" です。
BigQuery
テーブルはconnection_name.dataset.tableとして参照します。
外部データベースのクエリは標準SQLとまったく同じように機能します。結合、サブクエリ、ウィンドウ関数、CTEなど、DuckDBがサポートするすべての機能を使用できます。
Tip
照会する前に、まず「外部データ接続」パネルで外部接続を設定してください。
-- Query a PostgreSQL table
SELECT * FROM my_postgres.public.customers
WHERE country = 'USA'
-- Query a BigQuery table
SELECT event_date, COUNT(*) as events
FROM my_bigquery.analytics.page_views
GROUP BY event_date
-- Join PostgreSQL with BigQuery
SELECT p.name, b.total_events
FROM my_postgres.public.products p
JOIN my_bigquery.analytics.product_stats b
ON p.id = b.product_id外部データベースクエリの例
スプレッドシートとデータベースデータの結合
最も強力な機能の一つは、異なるソースにまたがるデータを結合できることです。スプレッドシートのデータと外部データベースを1つのクエリで組み合わせることができます。
一般的なユースケース
- スプレッドシートのレコードをデータベースの顧客データで補完する
- ローカルのトラッキングデータをデータウェアハウスと比較する
- スプレッドシートのエントリを外部参照テーブルに対して検証する
- シートの売上データとデータベースの商品カタログを組み合わせる
-- Join spreadsheet orders with database customers
SELECT
s.order_id,
s.order_date,
s.amount,
c.customer_name,
c.email,
c.tier
FROM sheet_range('Orders!A1:D500') s
JOIN my_postgres.public.customers c
ON s.customer_id = c.id
WHERE s.amount > 1000
-- Cross-database aggregation
SELECT
c.country,
COUNT(*) as order_count,
SUM(s.amount) as total_sales
FROM sheet_range('Sales!A1:C1000') s
JOIN my_postgres.public.customers c
ON s.customer_id = c.id
GROUP BY c.country
ORDER BY total_sales DESCクロスソース結合の例
クエリ出力オプション
クエリ結果は2つの方法で出力できます。
インライン結果(デフォルト)
結果はModelMonkeyに直接返され、分析と推論に使用されます。データをどう活用するか決める前にデータを理解したい探索的なクエリに役立ちます。
- デフォルトで最大20行を返します(最大100行まで設定可能)
- 列の型とメタデータを含みます
- クイックなデータ探索に最適です
シート出力
結果はスプレッドシートの新しいシートに直接書き込まれます。クエリ結果をその後の作業のために保持したい場合に役立ちます。
- 指定した名前で新しいシートを作成します
- すべての行を含みます(行数制限なし)
- ヘッダー行が自動的に追加されます
- レポートの作成やデータのステージングに最適です
Tip
シート出力モードを使用するには、ModelMonkeyに「結果を新しいシートに保存して」または「Results というシートに出力を書き込んで」と依頼してください。
データ型の処理
ModelMonkeyはスプレッドシートのデータから列の型を自動的に推論します。
サポートされる型
- 数値: 整数と小数が検出され、数値型として扱われます
- ブール値: TRUE/FALSE の値がブール値として認識されます
- テキスト: それ以外はすべてテキスト(VARCHAR)として扱われます
- 日付: セル内の日付値は通常テキストとして処理されます。解析にはSQLの日付関数を使用してください
型推論のプロセス
ModelMonkeyはデータの最初の数行をサンプリングして各列の適切な型を決定します。列に複数の型が混在している場合、データの損失を防ぐためにテキストがデフォルトになります。
-- Parse date strings in queries
SELECT
order_id,
strptime(order_date, '%Y-%m-%d') as parsed_date,
amount
FROM sheet_range('Orders!A1:C100')
WHERE strptime(order_date, '%Y-%m-%d') >= DATE '2024-01-01'
-- Cast numeric strings
SELECT
product_name,
CAST(price AS DOUBLE) as numeric_price
FROM sheet_range('Products!A1:B50')データ型の操作
パフォーマンスに関する考慮事項
クエリの実行
- クエリには30秒のタイムアウトがあります
- 安全のため、最大結果セットは16,384行です
- 大きなスプレッドシートの範囲はクエリのためにメモリに読み込まれます
ベストプラクティス
- 列全体ではなく正確な範囲を指定してください(例:
A:Dの代わりにA1:D500) - WHERE句を使って早期にフィルタリングし、処理するデータを削減してください
- 非常に大きなデータセットの場合は、メモリの問題を避けるためにシート出力の使用を検討してください
- 結合を高速化するために、大きな外部データベーステーブルにインデックスを作成してください
キャッシュ
クエリ結果はリクエスト間でキャッシュされません。各クエリは現在のスプレッドシートデータを再読み込みするため、常に最新の値が取得できます。
Warning
非常に大きな範囲(数万行)はクエリの実行速度を低下させる可能性があります。大規模な分析には、データのフィルタリングまたは外部データベースの使用をご検討ください。
サポートされているSQL機能
ModelMonkeyはDuckDBを通じて幅広いSQL機能をサポートしています。
標準操作
- SELECT、FROM、WHERE、ORDER BY、LIMIT
- 集計関数を使用したGROUP BY(SUM、COUNT、AVG、MIN、MAX など)
- DISTINCT および HAVING 句
- UNION、INTERSECT、EXCEPT
結合
- INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN
- クロス結合と自己結合
- 複数テーブルの結合
高度な機能
- サブクエリと CTE(WITH 句)
- ウィンドウ関数(ROW_NUMBER、RANK、LAG、LEAD など)
- CASE 式
- 文字列関数、日付関数、数学関数
サポート対象外
- INSERT、UPDATE、DELETE(クエリは読み取り専用)
- CREATE TABLE、ALTER TABLE(スキーマの変更不可)
- ストアドプロシージャまたはユーザー定義関数
クエリの例
よく使われるSQLクエリの実用的な例を以下に示します。
-- Monthly sales summary
SELECT
strftime(strptime(date, '%Y-%m-%d'), '%Y-%m') as month,
COUNT(*) as num_orders,
SUM(amount) as total_revenue,
AVG(amount) as avg_order_value
FROM sheet_range('Orders!A1:D1000')
GROUP BY month
ORDER BY month DESC
-- Find duplicate entries
SELECT email, COUNT(*) as count
FROM sheet_range('Contacts!A1:E500')
GROUP BY email
HAVING COUNT(*) > 1
-- Top customers by spending
SELECT
customer_id,
SUM(amount) as total_spent,
COUNT(*) as num_orders
FROM sheet_range('Orders!A1:D1000')
GROUP BY customer_id
ORDER BY total_spent DESC
LIMIT 10
-- Running total with window function
SELECT
date,
amount,
SUM(amount) OVER (ORDER BY date) as running_total
FROM sheet_range('Transactions!A1:C100')実用的なSQLクエリの例
トラブルシューティング
「列が見つかりません」エラー
- ヘッダー行に期待する列名が含まれているか確認してください
- 列名は大文字と小文字を区別します
- 列名にスペースを含めることはできますが、複雑なクエリではクォートが必要な場合があります
「無効な範囲」エラー
- シート名のスペルが正しいか確認してください
- 範囲が存在し、データが含まれていることを確認してください
- エスケープが必要な特殊文字がシート名に含まれていないか確認してください
「クエリタイムアウト」エラー
- クエリを簡略化するか、データ範囲を縮小してください
- WHERE 句を追加してデータを早期にフィルタリングしてください
- 大きな結果セットにはシート出力の使用を検討してください
「接続が見つかりません」エラー
- 外部接続名が正しいか確認してください
- 「外部データ接続」パネルで接続がアクティブになっているか確認してください
- 外部データベースへのアクセス権限があることを確認してください
空または予期しない結果
- データ型が WHERE 条件と一致しているか確認してください
- 日付形式がスプレッドシートの内容と一致しているか確認してください
- テキストデータの先頭または末尾のスペースを確認してください