# Kueri umum

Saat Anda terhubung ke basis data, Anda akan dapat mengambil data melalui kueri SQL. Bagian ini menyediakan contoh kueri SQL untuk membantu Anda mulai bekerja dengan Private Telematics Lakehouse. Contoh-contoh ini menunjukkan cara mengakses dan menganalisis data dari **Raw data** layer, yang berisi data bisnis dan telematika mentah dengan transformasi minimal.

{% hint style="danger" %}
Harap diperhatikan: Karena basis data mengandung jumlah informasi yang sangat besar, pastikan untuk membuat kueri uji berdasarkan sejumlah nilai yang terbatas yang diambil.
{% endhint %}

## Kueri dasar

### Ambil informasi objek dasar

Kueri ini mengembalikan informasi tentang objek (kendaraan/aset) dalam sistem Anda:

```sql
SELECT
    o.object_id,
    o.object_label,
    o.model,
    d.device_imei,
    g.group_label
FROM
    raw_business_data.objects o
    LEFT JOIN raw_business_data.devices d ON o.device_id = d.device_id
    LEFT JOIN raw_business_data.groups g ON o.group_id = g.group_id
WHERE
    o.is_deleted = false
ORDER BY
    o.object_label;
```

### Dapatkan lokasi perangkat terbaru

Ambil data lokasi terbaru untuk semua perangkat Anda:

```sql
SELECT
    t.device_id,
    o.object_label,
    -- Konversikan koordinat bilangan bulat yang diskalakan kembali ke format desimal
    t.latitude::float / 10000000 AS latitude,
    t.longitude::float / 10000000 AS longitude,
    t.speed,
    t.device_time
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 > (CURRENT_DATE - INTERVAL '1 day')
    AND t.latitude != 0
    AND t.longitude != 0
ORDER BY
    t.device_id, t.device_time DESC;
```

{% hint style="info" %}
Nilai koordinat disimpan sebagai bilangan bulat yang diskalakan dengan 10^7 untuk efisiensi penyimpanan yang lebih baik di TimescaleDB. Saat melakukan kueri, bagi dengan 10000000 untuk mengonversinya kembali ke format desimal standar.
{% endhint %}

## Menggabungkan data bisnis dan telematika

### Laporan aktivitas kendaraan

Kueri ini menghasilkan ringkasan aktivitas harian dengan menggabungkan data bisnis dan telematika:

```sql
SELECT
    o.object_label AS vehicle,
    v.vehicle_type,
    DATE(t.device_time) AS date,
    COUNT(DISTINCT DATE_PART('hour', t.device_time)) AS active_hours,
    MAX(t.speed) AS max_speed,
    AVG(t.speed) AS avg_speed
FROM
    raw_telematics_data.tracking_data_core t
    JOIN raw_business_data.objects o ON t.device_id = o.device_id
    LEFT JOIN raw_business_data.vehicles v ON o.object_id = v.object_id
WHERE
    t.device_time BETWEEN '2025-03-01' AND '2025-03-28'
GROUP BY
    o.object_label, v.vehicle_type, DATE(t.device_time)
ORDER BY
    o.object_label, DATE(t.device_time);
```

### Penugasan pengemudi dan riwayat lokasi

Lacak karyawan mana yang ditugaskan ke kendaraan mana dan riwayat lokasinya:

```sql
SELECT 
    o.object_label AS vehicle,
    new_row.changed_datetime AS assignment_time,
    e_new.first_name || ' ' || e_new.last_name AS new_driver_name,
    e_old.first_name || ' ' || e_old.last_name AS old_driver_name,
    new_row.address,
    new_row.latitude,
    new_row.longitude
FROM 
    raw_business_data.driver_history new_row
JOIN 
    raw_business_data.driver_history old_row
    ON new_row.changed_datetime = old_row.changed_datetime
    AND new_row.object_id = old_row.object_id
LEFT JOIN 
    raw_business_data.employees e_new ON new_row.new_employee_id = e_new.employee_id
LEFT JOIN 
    raw_business_data.employees e_old ON old_row.old_employee_id = e_old.employee_id
LEFT JOIN 
    raw_business_data.objects o ON new_row.object_id = o.object_id
ORDER BY 
    assignment_time;
```

## Menganalisis data sensor

### Pelacakan tingkat bahan bakar

Kueri ini menunjukkan cara menganalisis data sensor bahan bakar:

```sql
SELECT
    o.object_label AS vehicle,
    t.device_time,
    i.value::numeric AS fuel_level
FROM
    raw_telematics_data.inputs i
    JOIN raw_business_data.objects o ON i.device_id = o.device_id
    JOIN raw_telematics_data.tracking_data_core t ON
        i.device_id = t.device_id AND
        i.device_time = t.device_time
WHERE
    i.sensor_name = 'fuel'
    AND t.device_time > (CURRENT_DATE - INTERVAL '7 days')
ORDER BY
    o.object_label, t.device_time;
```

## Analisis geospasial

### Kendaraan di geozona

Identifikasi kendaraan mana yang memasuki geozona tertentu:

```sql
SELECT
    o.object_label AS vehicle,
    z.zone_label AS geozone,
    t.device_time AS entry_time
FROM
    raw_telematics_data.tracking_data_core t
    JOIN raw_business_data.objects o ON t.device_id = o.device_id
    JOIN raw_business_data.zones z ON
        -- Hitung apakah titik berada di dalam zona melingkar
        -- Konversikan koordinat dari bilangan bulat yang diskalakan ke desimal
        (
            CASE
                WHEN z.zone_type = 'circle' THEN
                    ST_DWithin(
                        ST_MakePoint(t.longitude::float/10000000, t.latitude::float/10000000)::geography,
                        ST_MakePoint(z.circle_center_longitude, z.circle_center_latitude)::geography,
                        z.radius
                    )
                ELSE false
            END
        )
WHERE
    t.device_time > (CURRENT_DATE - INTERVAL '1 day')
ORDER BY
    z.zone_label, o.object_label, t.device_time;
```

{% hint style="info" %}
Kueri ini menggunakan fungsi spasial PostGIS. Jika Anda mengalami kesalahan, verifikasi bahwa ekstensi PostGIS diaktifkan di basis data Anda.
{% endhint %}

## Tips optimasi performa

Saat bekerja dengan Cloud Data Warehouse, pertimbangkan teknik optimasi berikut:

1. **Gunakan pemfilteran berbasis waktu**: Selalu sertakan filter waktu pada `device_time` atau `record_added_at` kolom untuk membatasi data yang dipindai.\
   **Praktik yang baik**:

```sql
SELECT * FROM raw_telematics_data.tracking_data_core 
WHERE device_time > (CURRENT_DATE - INTERVAL '7 days');
```

**Hindari ini** (memindai seluruh tabel)

```sql
SELECT * FROM raw_telematics_data.tracking_data_core;
```

2. **Manfaatkan indeks**: Basis data memiliki indeks pada `(device_id, device_time)` pasangan. Susun kueri Anda agar menggunakan indeks ini bila memungkinkan.
3. **Gunakan join secara selektif**: Gabungkan tabel hanya jika diperlukan dan coba filter data sebelum menggabungkan tabel berukuran besar.
4. **Konversi bilangan bulat yang diskalakan**: Ingat bahwa data koordinat disimpan sebagai bilangan bulat yang diskalakan. Lakukan konversi hanya pada SELECT akhir, bukan pada klausa WHERE.
5. **Batasi set hasil**: Selalu gunakan LIMIT untuk kueri eksploratif agar tidak mengembalikan jutaan baris.

```sql
SELECT * FROM raw_telematics_data.tracking_data_core 
WHERE device_time > (CURRENT_DATE - INTERVAL '1 day')
LIMIT 1000;
```

6. **Manfaatkan hubungan hierarkis**: Susun kueri kompleks mengikuti hierarki entitas (**dealer → client → user/device → object**) untuk join dan pemfilteran yang lebih efisien.
7. **Kelola koneksi dengan benar**: Tutup koneksi basis data saat tidak digunakan, terutama di alat BI atau skrip terjadwal, untuk menghindari penguncian sumber daya atau masalah batas waktu.

## Langkah berikutnya

Contoh-contoh ini memberikan titik awal untuk bekerja dengan data Anda. Seiring Anda semakin mengenal skema, Anda dapat mengembangkan kueri yang lebih kompleks untuk memenuhi kebutuhan bisnis spesifik Anda.


---

# 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/example-queries/common-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.
