Kueri SQL dengan DuckDB
Kueri data spreadsheet dan database eksternal Anda menggunakan SQL
Gambaran Umum
ModelMonkey menyertakan mesin SQL bawaan yang didukung oleh DuckDB, memungkinkan Anda menjalankan kueri SQL langsung pada data spreadsheet Anda. Anda juga dapat mengkueri database eksternal (PostgreSQL, BigQuery) dan bahkan menggabungkan data dari beberapa sumber.
Fitur ini berguna saat Anda membutuhkan kontrol presisi atas transformasi data, ingin melakukan agregasi kompleks, atau perlu menggabungkan data dari sumber yang berbeda dengan cara yang mungkin tidak dapat diungkapkan dengan jelas menggunakan bahasa alami.
Tip
Anda tidak perlu menulis SQL sendiri. Cukup deskripsikan apa yang Anda inginkan dalam bahasa sehari-hari, dan ModelMonkey akan membuat serta menjalankan kueri SQL yang sesuai untuk Anda.
Kapan Kueri SQL Digunakan
ModelMonkey secara otomatis menggunakan kueri SQL saat permintaan Anda melibatkan:
Agregasi Kompleks
Mengelompokkan data, menghitung jumlah, rata-rata, cacahan, atau operasi statistik lainnya di banyak baris.
Pemfilteran dan Pengurutan
Menemukan rekaman tertentu berdasarkan beberapa kondisi, atau mengurutkan kumpulan data besar berdasarkan berbagai kriteria.
Penggabungan Data
Menggabungkan data dari spreadsheet Anda dengan database eksternal, atau menggabungkan beberapa sheet menjadi satu.
Transformasi Data
Memformat ulang, menghitung kolom baru, atau merestrukturisasi data dengan cara yang membutuhkan pemrosesan baris per baris.
Anda juga dapat secara eksplisit meminta ModelMonkey untuk "gunakan SQL" atau "jalankan kueri SQL" jika Anda lebih menyukai presisi SQL untuk operasi tertentu.
Mengkueri Data Spreadsheet
Data spreadsheet Anda dapat diakses melalui fungsi sheet_range(). Fungsi ini menerima referensi notasi A1 dan mengembalikan data sebagai tabel yang dapat dikueri.
Persyaratan Penting
- Baris pertama dari rentang Anda harus berisi header kolom
- Nama kolom diturunkan dari baris header
- Header yang kosong menghasilkan kolom bernama seperti "column_1", "column_2", dst.
Format Rentang yang Didukung
- Sheet penuh:
sheet_range('Sheet1!A:Z') - Rentang tertentu:
sheet_range('Sales!A1:D100') - Rentang bernama dengan karakter khusus secara otomatis di-escape
-- 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 DESCContoh kueri spreadsheet
Mengkueri Database Eksternal
Jika Anda telah mengonfigurasi koneksi data eksternal, Anda dapat mengkuerinya menggunakan nama koneksi mereka:
PostgreSQL
Referensikan tabel sebagai connection_name.schema.table. Skema default biasanya adalah "public".
BigQuery
Referensikan tabel sebagai connection_name.dataset.table.
Kueri database eksternal bekerja persis seperti SQL standar. Anda dapat menggunakan semua fitur yang didukung oleh DuckDB, termasuk join, subkueri, fungsi window, dan CTE.
Tip
Siapkan koneksi eksternal Anda terlebih dahulu di panel External Data Connections sebelum mengkuerinya.
-- 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_idContoh kueri database eksternal
Menggabungkan Data Spreadsheet dan Database
Salah satu fitur paling powerful adalah kemampuan untuk menggabungkan data dari berbagai sumber. Anda dapat mengombinasikan data spreadsheet dengan database eksternal dalam satu kueri.
Kasus Penggunaan Umum
- Perkaya rekaman spreadsheet dengan data pelanggan dari database Anda
- Bandingkan data pelacakan lokal dengan data warehouse Anda
- Validasi entri spreadsheet terhadap tabel referensi eksternal
- Gabungkan data penjualan dari sheet dengan katalog produk dari database
-- 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 DESCContoh join lintas sumber
Opsi Output Kueri
Hasil kueri dapat dikirimkan dengan dua cara:
Hasil Inline (Default)
Hasil dikembalikan langsung ke ModelMonkey untuk analisis dan penalaran. Ini berguna untuk kueri eksplorasi di mana Anda ingin memahami data sebelum memutuskan apa yang harus dilakukan dengannya.
- Mengembalikan hingga 20 baris secara default (dapat dikonfigurasi hingga 100)
- Menyertakan tipe kolom dan metadata
- Ideal untuk eksplorasi data cepat
Output Sheet
Hasil ditulis langsung ke sheet baru di spreadsheet Anda. Ini berguna saat Anda ingin menyimpan hasil kueri untuk pekerjaan lebih lanjut.
- Membuat sheet baru dengan nama yang Anda tentukan
- Menyertakan semua baris (tanpa batas baris)
- Baris header ditambahkan secara otomatis
- Sempurna untuk membuat laporan atau menyiapkan data
Tip
Minta ModelMonkey untuk "simpan hasil ke sheet baru" atau "tulis output ke sheet bernama Results" untuk menggunakan mode output sheet.
Penanganan Tipe Data
ModelMonkey secara otomatis menyimpulkan tipe kolom dari data spreadsheet Anda:
Tipe yang Didukung
- Angka: Bilangan bulat dan desimal terdeteksi dan diperlakukan sebagai tipe numerik
- Boolean: Nilai TRUE/FALSE dikenali sebagai boolean
- Teks: Semua yang lain diperlakukan sebagai teks (VARCHAR)
- Tanggal: Nilai tanggal dalam sel biasanya ditangani sebagai teks; gunakan fungsi tanggal SQL untuk mengurainya
Proses Inferensi Tipe
ModelMonkey mengambil sampel beberapa baris pertama data untuk menentukan tipe yang sesuai untuk setiap kolom. Jika sebuah kolom berisi tipe campuran, defaultnya adalah teks untuk menghindari kehilangan data.
-- 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')Bekerja dengan tipe data
Pertimbangan Performa
Eksekusi Kueri
- Kueri memiliki batas waktu 30 detik
- Kumpulan hasil maksimum adalah 16.384 baris untuk keamanan
- Rentang spreadsheet yang besar dimuat ke memori untuk dikueri
Praktik Terbaik
- Tentukan rentang yang presisi alih-alih seluruh kolom (misalnya,
A1:D500daripadaA:D) - Gunakan klausa WHERE untuk memfilter lebih awal dan mengurangi data yang diproses
- Untuk kumpulan data yang sangat besar, pertimbangkan untuk menggunakan output sheet guna menghindari masalah memori
- Buat indeks pada tabel database eksternal yang besar untuk join yang lebih cepat
Caching
Hasil kueri tidak di-cache di antara permintaan. Setiap kueri membaca ulang data spreadsheet saat ini, memastikan Anda selalu mendapatkan nilai terbaru.
Warning
Rentang yang sangat besar (puluhan ribu baris) dapat memperlambat eksekusi kueri. Pertimbangkan untuk memfilter data atau menggunakan database eksternal untuk analitik berskala besar.
Fitur SQL yang Didukung
ModelMonkey mendukung berbagai fitur SQL melalui DuckDB:
Operasi Standar
- SELECT, FROM, WHERE, ORDER BY, LIMIT
- GROUP BY dengan fungsi agregat (SUM, COUNT, AVG, MIN, MAX, dll.)
- Klausa DISTINCT dan HAVING
- UNION, INTERSECT, EXCEPT
Join
- INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN
- Cross join dan self join
- Join beberapa tabel
Fitur Lanjutan
- Subkueri dan CTE (klausa WITH)
- Fungsi window (ROW_NUMBER, RANK, LAG, LEAD, dll.)
- Ekspresi CASE
- Fungsi string, fungsi tanggal, fungsi matematika
Tidak Didukung
- INSERT, UPDATE, DELETE (kueri bersifat read-only)
- CREATE TABLE, ALTER TABLE (tidak ada modifikasi skema)
- Stored procedure atau fungsi yang didefinisikan pengguna
Contoh Kueri
Berikut adalah beberapa contoh praktis kueri SQL yang mungkin Anda gunakan:
-- 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')Contoh kueri SQL praktis
Pemecahan Masalah
Error "Column not found"
- Periksa bahwa baris header Anda berisi nama kolom yang diharapkan
- Nama kolom bersifat case-sensitive
- Spasi dalam nama kolom dapat digunakan tetapi mungkin perlu dikutip dalam kueri kompleks
Error "Invalid range"
- Verifikasi nama sheet dieja dengan benar
- Pastikan rentang ada dan berisi data
- Periksa karakter khusus dalam nama sheet yang perlu di-escape
Error "Query timeout"
- Sederhanakan kueri Anda atau kurangi rentang data
- Tambahkan klausa WHERE untuk memfilter data lebih awal
- Pertimbangkan untuk menggunakan output sheet untuk kumpulan hasil yang besar
Error "Connection not found"
- Verifikasi nama koneksi eksternal sudah benar
- Periksa bahwa koneksi aktif di panel External Data Connections
- Pastikan Anda memiliki izin untuk mengakses database eksternal
Hasil kosong atau tidak terduga
- Periksa apakah tipe data sesuai dengan kondisi WHERE Anda
- Verifikasi format tanggal sesuai dengan yang ada di spreadsheet Anda
- Cari spasi di awal/akhir dalam data teks