# Menulis kueri SQL

Dashboard Studio menggunakan SQL untuk mengambil data dari skema IoT Query. Anda menulis SQL dalam dua konteks: editor panel, tempat pernyataan menggerakkan visualisasi, dan SQL Editor mandiri untuk eksplorasi data. Halaman ini menjelaskan cara menulis SQL yang efektif untuk kedua konteks, dengan penekanan pada persyaratan visualisasi karena memiliki batasan struktural khusus.

### Tempat SQL digunakan

Dashboard Studio menyediakan dua lingkungan SQL untuk tujuan yang berbeda. Memahami kapan menggunakan masing-masing membantu Anda bekerja lebih efisien.

[**Query visualisasi**](#how-to-write-sql-for-visualizations) menggerakkan panel individual dalam laporan. Anda menulis pernyataan ini di **Kueri SQL** tab editor panel. Setiap panel menjalankan satu pernyataan yang harus mengembalikan data dalam struktur tertentu yang sesuai dengan jenis visualisasi. Pernyataan ini dieksekusi saat laporan dimuat atau disegarkan, sehingga performa penting bagi pengalaman pengguna. SQL visualisasi tidak dapat memodifikasi data; semua pernyataan dijalankan sebagai operasi SELECT hanya-baca terhadap skema IoT Query.

**Laporan** menggunakan pendekatan SQL visualisasi yang sama seperti panel dashboard. Sebuah laporan menjalankan satu query yang menggerakkan tiga tampilan sekaligus: tabel data, bagan, dan peta lokasi. Pernyataan harus mengembalikan semua kolom yang dibutuhkan di ketiga komponen, jadi sertakan kolom koordinat, waktu, dan metrik bersama-sama dalam satu SELECT.

[**SQL Editor**](#how-to-use-the-sql-editor) mendukung eksplorasi dan ekspor data. Akses SQL Editor dari bilah sisi kiri di bawah Tools. Tulis pernyataan SELECT apa pun untuk memeriksa struktur data, memvalidasi asumsi, atau mengekspor hasil sebagai CSV. SQL Editor menampilkan tabel hasil lengkap dengan pengurutan kolom dan menyediakan metrik eksekusi. Gunakan ini untuk menguji logika sebelum menambahkan SQL ke panel visualisasi, atau untuk ekstraksi data ad hoc yang tidak memerlukan visualisasi.

{% hint style="info" %}
**Perbedaan utamanya**: SQL visualisasi harus cocok dengan struktur kolom yang tepat, sedangkan pernyataan SQL Editor dapat mengembalikan format hasil apa pun. Uji logika kompleks terlebih dahulu di SQL Editor, lalu sesuaikan untuk visualisasi.
{% endhint %}

### Cara menulis SQL untuk visualisasi

<figure><img src="/files/c7c872c67a9a16131c15428c114b2a72e54c646f" alt=""><figcaption></figcaption></figure>

SQL visualisasi harus mengembalikan jumlah kolom dan tipe data tertentu. Dashboard Studio tidak dapat merender diagram batang dari tiga kolom atau kartu stat dari data teks. Periksa bagian Dataset Requirements di tab SQL Query untuk melihat dengan tepat apa yang diharapkan oleh visualisasi yang Anda pilih sebelum menulis pernyataan. Tabel di bawah ini berisi jenis visualisasi yang didukung:

| Visualisasi                   | Persyaratan query          | Contoh                                                            |
| ----------------------------- | -------------------------- | ----------------------------------------------------------------- |
| [Kartu stat](#stat-tiles)     | Satu nilai numerik         | `SELECT COUNT(*) FROM schema.table`                               |
| [Diagram batang](#bar-charts) | Dua kolom: category, value | `SELECT column1, COUNT(*) FROM schema.table GROUP BY column1`     |
| [Diagram pai](#pie-charts)    | Dua kolom: label, value    | `SELECT category, SUM(value) FROM schema.table GROUP BY category` |
| [Tabel](#tables)              | Kolom apa pun              | `SELECT column1, column2, column3 FROM schema.table`              |
| [Teks](#text-panels)          | Tidak memerlukan query     | Hanya konten Markdown                                             |

<details>

<summary>Kartu statistik</summary>

Kartu stat menampilkan nilai numerik tunggal. Pernyataan harus mengembalikan tepat satu baris dengan satu kolom numerik:

{% code title="Total perjalanan pada bulan berjalan" overflow="wrap" %}

```sql
SELECT COUNT(*) as value
FROM silver.trips
WHERE start_time >= DATE_TRUNC('month', CURRENT_DATE);
```

{% endcode %}

{% code title="Total jarak yang ditempuh (km)" overflow="wrap" %}

```sql
SELECT SUM(distance_km) as value
FROM silver.trips
WHERE start_time >= CURRENT_DATE - INTERVAL '7 days';
```

{% endcode %}

Nama kolom tidak penting, yang penting hasilnya adalah satu nilai numerik. Dashboard Studio menampilkan nilai ini dengan pemformatan yang Anda konfigurasikan di Visualization Settings.

</details>

<details>

<summary>Diagram batang</summary>

Diagram batang memerlukan tepat dua kolom: kategori (teks atau tanggal) dan nilai (numerik). Kolom pertama menjadi sumbu X, kolom kedua menjadi tinggi batang:

{% code title="Perjalanan per jenis kendaraan" overflow="wrap" %}

```sql
SELECT 
  vehicle_type as category,
  COUNT(*) as value
FROM silver.trips
WHERE start_time >= DATE_TRUNC('month', CURRENT_DATE)
GROUP BY vehicle_type
ORDER BY value DESC;
```

{% endcode %}

{% code title="Jumlah perjalanan harian" overflow="wrap" %}

```sql
SELECT 
  DATE_TRUNC('day', start_time)::date as category,
  COUNT(*) as value
FROM silver.trips
WHERE start_time >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY DATE_TRUNC('day', start_time)
ORDER BY category;
```

{% endcode %}

Gunakan `ORDER BY` untuk mengontrol urutan batang. Urutkan berdasarkan nilai untuk perbandingan berperingkat atau berdasarkan kategori untuk perkembangan deret waktu.

</details>

<details>

<summary>Diagram pai</summary>

Diagram pai memerlukan tepat dua kolom: label (teks) dan nilai (numerik). Kolom pertama menjadi label irisan, kolom kedua menentukan ukuran irisan:

{% code title="Distribusi perjalanan berdasarkan zona" %}

```sql
SELECT 
  zone_name as label,
  COUNT(*) as value
FROM silver.zone_visits
WHERE enter_time >= DATE_TRUNC('month', CURRENT_DATE)
GROUP BY zone_name
ORDER BY value DESC
LIMIT 10;
```

{% endcode %}

Tambahkan klausa LIMIT untuk kategori dengan banyak nilai. Diagram pai dengan 20+ irisan menjadi tidak terbaca; batasi hingga 10-15 kategori teratas.

</details>

<details>

<summary>Tabel</summary>

Tabel menerima jumlah kolom berapa pun dengan tipe data apa pun. Pilih kolom yang ingin Anda tampilkan:

{% code title="Rincian perjalanan terbaru" %}

```sql
SELECT 
  device_id,
  start_time,
  end_time,
  distance_km,
  duration_minutes,
  max_speed_kmh
FROM silver.trips
WHERE start_time >= CURRENT_DATE - INTERVAL '7 days'
ORDER BY start_time DESC
LIMIT 100;
```

{% endcode %}

Nama kolom menjadi header tabel. Gunakan alias dengan spasi untuk header yang mudah dibaca: `distance_km as "Distance (km)"`.

</details>

<details>

<summary>Panel teks</summary>

Panel teks menampilkan nilai teks tunggal atau string yang diformat. Pernyataan harus mengembalikan satu kolom teks:

{% code title="Timestamp pembaruan data terakhir" %}

```sql
SELECT 
  'Last updated: ' || MAX(record_added_at)::text as value
FROM bronze.tracking_data_core;
```

{% endcode %}

</details>

Query laporan mengikuti aturan struktural yang sama seperti query visualisasi di panel dashboard. Karena satu pernyataan menggerakkan tabel data, bagan, dan peta lokasi sekaligus, Anda mungkin perlu menggabungkan kolom yang pada dashboard akan ditulis sebagai query panel terpisah. Misalnya, query panel diagram batang yang mengembalikan dua kolom tidak cukup untuk laporan yang juga memerlukan koordinat GPS untuk peta lokasi. Sertakan semua kolom yang diperlukan untuk setiap komponen dalam satu pernyataan. Logika filtering dan JOIN inti tetap sama seperti pada query panel; hanya klausa SELECT yang perlu lebih lebar.

### Cara menulis SQL untuk laporan

Sebuah laporan menjalankan satu query SQL yang menggerakkan tiga komponen sekaligus: tabel data, bagan, dan peta lokasi. Tidak seperti panel dashboard, di mana setiap panel memiliki query fokusnya sendiri, query laporan harus mengembalikan semua kolom yang dibutuhkan di setiap komponen dalam satu pernyataan SELECT.

#### Persyaratan kolom per komponen

Setiap komponen laporan memiliki persyaratan kolom tertentu. Query Anda harus memenuhi semua komponen yang telah Anda aktifkan.

| Komponen    | Kolom yang diperlukan                                                    | Catatan                                                     |
| ----------- | ------------------------------------------------------------------------ | ----------------------------------------------------------- |
| Tabel data  | Kolom apa pun                                                            | Semua kolom yang dikembalikan muncul sebagai kolom tabel    |
| Bagan       | Setidaknya satu kolom waktu atau kategori, setidaknya satu kolom numerik | Kolom sumbu dipilih di pengaturan bagan                     |
| Peta lokasi | Lintang dan bujur dalam derajat desimal                                  | Dashboard Studio mendeteksi kolom koordinat secara otomatis |

Karena tabel data menerima kolom apa pun, tidak ada batasan tambahan. Bagan dan peta lokasi menjadi penentu utama keputusan struktural.

#### Menggabungkan komponen dalam satu query

Query yang hanya mengembalikan kolom yang dibutuhkan untuk bagan (dua kolom: category dan value) juga tidak dapat menggerakkan peta lokasi. Anda harus menyertakan semua kolom yang diperlukan bersama-sama.

Contoh berikut mengembalikan kolom untuk ketiga komponen: kolom waktu dan kolom numerik untuk bagan, kolom koordinat untuk peta lokasi, dan atribut tambahan yang muncul di tabel data.

```sql
SELECT
    t.device_id,
    o.object_label,
    t.device_time,
    t.latitude::float / 10000000 AS latitude,
    t.longitude::float / 10000000 AS longitude,
    t.speed::float / 100 AS speed
FROM raw_telematics_data.tracking_data_core t
JOIN raw_business_data.objects o ON t.device_id = o.device_id
WHERE t.device_time >= NOW() - INTERVAL '24 hours'
ORDER BY t.device_time DESC
LIMIT 1000
```

Dalam query ini, `device_time` dan `speed` berfungsi untuk bagan, `latitude` dan `longitude` berfungsi untuk peta lokasi, dan semua kolom muncul di tabel data.

{% hint style="info" %}
Tabel telematik mentah menyimpan koordinat dan kecepatan sebagai integer yang diskalakan. Koordinat dibagi 10.000.000 (10⁷) untuk dikonversi menjadi derajat desimal, dan kecepatan dibagi 100 (10²) untuk dikonversi menjadi km/jam. Terapkan konversi ini dalam query apa pun yang membaca dari `raw_telematics_data` tabel.
{% endhint %}

#### Menyesuaikan query panel dashboard untuk laporan

Setiap query panel dari dashboard adalah titik awal yang valid untuk laporan. Penyesuaian yang diperlukan bergantung pada komponen mana yang ingin Anda aktifkan.

Jika query panel sudah berupa visualisasi tabel yang mengembalikan beberapa kolom, kemungkinan query tersebut sudah mencakup semuanya. Tambahkan kolom koordinat jika peta lokasi diperlukan.

Jika query panel adalah query diagram batang atau kartu stat yang mengembalikan hasil agregat, kemungkinan besar query tersebut tidak memiliki detail tingkat baris yang diperlukan untuk tabel data dan peta lokasi. Dalam kasus itu, hapus agregasinya dan bekerja dari data lapisan raw atau Silver yang mendasarinya.

[Buku Resep SQL](/docs/analytics/id/example-queries.md) berisi contoh query siap pakai untuk analisis armada yang umum. Resep dari buku ini dapat disesuaikan untuk laporan dengan menambahkan kolom koordinat di tempat peta lokasi diperlukan. Logika WHERE dan JOIN inti dapat ditransfer langsung; sesuaikan hanya klausa SELECT agar mencakup semua komponen yang diperlukan.

### Cara menggunakan variabel global

Variabel global menyediakan nilai yang dapat digunakan kembali di berbagai pernyataan SQL. Definisikan variabel di **Settings > Configuration > Global Variables**, lalu rujuk menggunakan `${variable_name}` sintaks.

<figure><img src="/files/e6e027999d9885e125363f54c7beca26c8788a5c" alt=""><figcaption></figcaption></figure>

Definisikan variabel untuk nilai yang berubah secara berkala tetapi tetap konsisten di berbagai panel: rentang tanggal analisis, filter jenis kendaraan, atau nilai ambang. Saat nilai-nilai ini berubah, perbarui definisi variabel sekali saja alih-alih mengedit pernyataan SQL satu per satu.

{% code title="Menggunakan variabel rentang tanggal" %}

```sql
SELECT 
  DATE_TRUNC('day', start_time)::date as category,
  COUNT(*) as value
FROM silver.trips
WHERE start_time >= '${analysis_start_date}'::date
  AND start_time < '${analysis_end_date}'::date
GROUP BY DATE_TRUNC('day', start_time)
ORDER BY category;
```

{% endcode %}

Variabel menyimpan nilai teks. Cast ke tipe yang sesuai dalam SQL: `'${variable_name}'::date` untuk tanggal, `'${variable_name}'::integer` untuk angka.

Untuk parameter khusus per pernyataan yang sering berubah, Anda dapat menggunakan blok parameter CTE di awal:

```sql
WITH params AS (
  SELECT 
    5 as min_idle_minutes,
    10 as max_idle_speed_kmh,
    '${analysis_start_date}'::date as date_from,
    '${analysis_end_date}'::date as date_to
)

SELECT 
  device_id,
  COUNT(*) as idle_count,
  SUM(duration_minutes) as total_idle_minutes
FROM silver.idle_events e
CROSS JOIN params p
WHERE e.event_time >= p.date_from
  AND e.event_time < p.date_to
  AND e.speed_kmh <= p.max_idle_speed_kmh
  AND e.duration_minutes >= p.min_idle_minutes
GROUP BY device_id
ORDER BY total_idle_minutes DESC;
```

Pola ini menggabungkan variabel global (rentang tanggal) dengan parameter khusus per pernyataan (ambang), sehingga semua nilai yang dapat disesuaikan tetap berada di bagian atas untuk kemudahan pemeliharaan.

### Cara mengakses skema IoT Query

IoT Query mengorganisasi data dalam lapisan Raw data, Transformation, dan Insight. Memahami lapisan mana yang harus digunakan menghemat waktu dan meningkatkan kejelasan SQL. Untuk detail skema lengkap, lihat [IoT Query Schema Overview](https://www.navixy.com/docs/analytics/iotquery/schema-overview).

**Lapisan Raw data** berisi titik pelacakan mentah dari perangkat: `bronze.tracking_data_core` menyimpan setiap posisi GPS dengan stempel waktu, koordinat, dan pembacaan sensor. Gunakan Raw data untuk analisis tingkat titik atau saat Anda memerlukan nilai sensor mentah yang belum diproses ke lapisan yang lebih tinggi.

**Lapisan Transformation** menyediakan entitas yang telah diproses: `silver.trips` mengagregasikan titik pelacakan menjadi catatan perjalanan dengan waktu mulai/akhir, jarak, dan durasi. `silver.zone_visits` mencatat kapan perangkat masuk dan keluar dari geofence. `silver.idle_events` mengidentifikasi periode saat kendaraan tetap diam dengan mesin menyala. Gunakan Transformation untuk sebagian besar kebutuhan visualisasi karena menyediakan struktur yang siap dianalisis.

**Lapisan Insight** menawarkan metrik yang telah diagregasi sebelumnya dan model dimensi untuk analitik kompleks. Gunakan Insight untuk statistik seluruh armada atau analisis multidimensi yang memerlukan JOIN kompleks terhadap tabel Silver.

Rujuk tabel menggunakan format `schema.table` : `silver.trips`, bukan hanya `trips`. Sertakan filter rentang tanggal dalam klausa WHERE untuk membatasi data yang dipindai:

{% code title="Selalu filter berdasarkan rentang waktu" %}

```sql
SELECT device_id, COUNT(*) as trip_count
FROM silver.trips
WHERE start_time >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY device_id;
```

{% endcode %}

Sebagian besar pernyataan SQL memfilter berdasarkan perangkat, rentang waktu, atau keduanya. Tambahkan filter ini lebih awal dalam klausa WHERE untuk mengurangi volume data yang diproses.

### Cara menggunakan SQL Editor

Akses SQL Editor dari bilah sisi kiri di bawah Tools. Gunakan untuk tiga tujuan utama: menguji logika sebelum menambahkan ke panel, menjelajahi skema data untuk memahami kolom yang tersedia, dan mengekspor data yang tidak memerlukan visualisasi.

<figure><img src="/files/5933340e7b2f49e2336a44459a027cb16162484a" alt=""><figcaption></figcaption></figure>

SQL Editor mendukung beberapa tab untuk pernyataan yang berbeda. Tulis SQL di tab, jalankan dengan tombol "Execute Query", dan lihat hasil di tabel di bawah. Hasil menampilkan metrik eksekusi (waktu eksekusi, baris yang dikembalikan) dan mendukung pengurutan kolom untuk pemeriksaan data yang cepat.

Ekspor hasil sebagai CSV menggunakan tombol "Export CSV". Ini berfungsi untuk laporan ad hoc atau ekstrak data untuk analisis eksternal. SQL Editor tidak memiliki batas baris hasil, tidak seperti SQL visualisasi yang seharusnya mengembalikan dataset yang terfokus.

Uji SQL visualisasi di SQL Editor sebelum menambahkannya ke panel. Tulis pernyataannya, verifikasi bahwa hasilnya mengembalikan kolom dan tipe data yang diharapkan, lalu salin ke tab SQL Query di editor panel. Alur kerja ini menangkap masalah struktural sebelum Anda mengonfigurasi pengaturan visualisasi.

Pola eksplorasi untuk data baru:

{% code expandable="true" %}

```sql
-- 1. Periksa struktur tabel
SELECT * FROM silver.trips LIMIT 10;

-- 2. Periksa cakupan rentang tanggal
SELECT 
  MIN(start_time) as earliest,
  MAX(start_time) as latest,
  COUNT(*) as total_trips
FROM silver.trips;

-- 3. Uji logika filtering
SELECT 
  device_id,
  start_time,
  distance_km
FROM silver.trips
WHERE start_time >= '2024-01-01'
  AND device_id = 12345
ORDER BY start_time;

-- 4. Sesuaikan untuk visualisasi (2 kolom untuk diagram batang)
SELECT 
  DATE_TRUNC('day', start_time)::date as day,
  COUNT(*) as trips
FROM silver.trips
WHERE start_time >= '2024-01-01'
  AND device_id = 12345
GROUP BY DATE_TRUNC('day', start_time)
ORDER BY day;
```

{% endcode %}

### Pola SQL umum

Sebagian besar SQL visualisasi mengikuti pola yang serupa. Salin struktur ini dan sesuaikan filter, kolom, serta agregasi untuk kebutuhan spesifik Anda.

<details>

<summary><strong>Hitungan deret waktu</strong> untuk melacak tren</summary>

```sql
SELECT 
  DATE_TRUNC('hour', start_time) as time_bucket,
  COUNT(*) as event_count
FROM silver.trips
WHERE start_time >= CURRENT_DATE - INTERVAL '24 hours'
GROUP BY DATE_TRUNC('hour', start_time)
ORDER BY time_bucket;
```

</details>

<details>

<summary><strong>Peringkat kategori</strong> untuk membandingkan kelompok</summary>

```sql
SELECT 
  category_column,
  COUNT(*) as count
FROM schema.table
WHERE filter_conditions
GROUP BY category_column
ORDER BY count DESC
LIMIT 15;
```

</details>

<details>

<summary><strong>Perhitungan metrik</strong> untuk statistik agregat</summary>

```sql
SELECT 
  SUM(distance_km) as total_distance,
  AVG(duration_minutes) as avg_duration,
  COUNT(*) as trip_count
FROM silver.trips
WHERE start_time >= DATE_TRUNC('week', CURRENT_DATE);
```

</details>

<details>

<summary><strong>Ringkasan terfilter</strong> dengan beberapa kondisi</summary>

```sql
SELECT 
  device_id,
  COUNT(*) as trips,
  SUM(distance_km) as total_km
FROM silver.trips
WHERE start_time >= '${period_start}'::date
  AND start_time < '${period_end}'::date
  AND distance_km >= 5
  AND duration_minutes >= 10
GROUP BY device_id
HAVING COUNT(*) >= 5
ORDER BY total_km DESC;
```

</details>

### Apa yang harus dilakukan saat SQL gagal

Kegagalan eksekusi terbagi menjadi tiga kategori: ketidaksesuaian struktural dengan persyaratan visualisasi, kesalahan sintaks SQL, atau filter yang tidak mengembalikan data.

#### **Ketidaksesuaian struktur kolom**

Terjadi ketika hasil tidak sesuai dengan ekspektasi visualisasi. Jika Anda memilih diagram batang tetapi SQL Anda mengembalikan tiga kolom, Dashboard Studio tidak dapat merendernya. Periksa Dataset Requirements di tab SQL Query. Diagram batang memerlukan tepat dua kolom (category, value), jadi sesuaikan klausa SELECT Anda:

```sql
-- Salah: tiga kolom
SELECT device_id, start_time, COUNT(*) FROM silver.trips GROUP BY device_id, start_time;

-- Benar: dua kolom
SELECT device_id, COUNT(*) as trips FROM silver.trips GROUP BY device_id;
```

#### **Kesalahan sintaks SQL**

Menampilkan pesan kesalahan spesifik. Masalah umum meliputi prefix skema yang hilang (`trips` alih-alih `silver.trips`), salah ketik pada nama kolom, atau casting tanggal yang salah. Uji pernyataan di SQL Editor untuk melihat pesan kesalahan terperinci dengan nomor baris.

#### **Hasil kosong**

Meskipun eksekusi berhasil, ini menunjukkan bahwa filter mengecualikan semua data. Uji SQL tanpa klausa WHERE di SQL Editor untuk memverifikasi bahwa tabel berisi data, lalu tambahkan filter secara bertahap untuk mengidentifikasi kondisi mana yang mengecualikan hasil yang Anda harapkan.

#### Masalah performa

Jika pernyataan dieksekusi lambat atau time out, tambahkan filter rentang tanggal ke klausa WHERE. Operasi yang memindai seluruh tabel memproses jutaan baris secara tidak perlu:

```sql
-- Lambat: tanpa filter tanggal
SELECT device_id, COUNT(*) FROM silver.trips GROUP BY device_id;

-- Cepat: filter rentang tanggal
SELECT device_id, COUNT(*) 
FROM silver.trips 
WHERE start_time >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY device_id;
```

Untuk panduan performa tambahan, lihat [Cara mengakses skema IoT Query](#how-to-access-iot-query-schemas) untuk praktik terbaik dalam filtering dan pemilihan skema.

### Di mana menemukan contoh SQL

Buku Resep SQL [Buku Resep SQL](/docs/analytics/id/example-queries.md) menyediakan contoh lengkap untuk analisis telematik yang umum. Resep ini mendemonstrasikan pola untuk analisis perjalanan, perhitungan kunjungan zona, deteksi idle, dan metrik armada. Setiap resep mencakup pernyataan SQL lengkap, penjelasan logika, dan hasil contoh.

Sesuaikan contoh Buku Resep untuk visualisasi dengan menyesuaikan klausa SELECT agar cocok dengan persyaratan visualisasi. Resep yang mengembalikan catatan perjalanan rinci dapat menjadi diagram batang dengan menambahkan GROUP BY dan agregasi COUNT. Pernyataan yang menghitung metrik per kendaraan dapat menjadi kartu stat dengan menambahkan SUM untuk seluruh kendaraan.

Anda hanya perlu:

1. Salin contoh dari [Buku Resep](/docs/analytics/id/example-queries.md) ke Editor Dashboard Studio.
2. Uji dengan data aktual Anda.
3. Verifikasi hasil, lalu ubah klausa SELECT untuk visualisasi target Anda.

Logika WHERE dan JOIN inti tetap sama; Anda hanya menyesuaikan struktur output.

Untuk detail skema, lihat [IoT Query Schema Overview](https://www.navixy.com/docs/analytics/iotquery/schema-overview). Referensi ini menjelaskan tabel yang tersedia, definisi kolom, dan hubungan antara lapisan Raw data, Transformation, dan Insight.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://navixy.com/docs/analytics/id/dashboard-studio/writing-sql-queries.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
