Kueri umum

Saat Anda tersambung ke basis data, Anda akan dapat mengambil data melalui kueri SQL. Bagian ini menyediakan contoh kueri SQL untuk membantu Anda memulai bekerja dengan Private Telematics Lakehouse. Contoh-contoh ini menunjukkan cara mengakses dan menganalisis data dari lapisan Bronze, yang berisi data bisnis dan telematik mentah dengan sedikit transformasi.

Kueri dasar

Ambil informasi objek dasar

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

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:

SELECT
    t.device_id,
    o.object_label,
    -- Konversi koordinat integer 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;

Nilai koordinat disimpan sebagai integer yang diskalakan dengan 10^7 untuk efisiensi penyimpanan yang lebih baik di TimescaleDB. Saat melakukan kueri, bagi dengan 10000000 untuk mengonversi kembali ke format desimal standar.

Menggabungkan data bisnis dan telematik

Laporan aktivitas kendaraan

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

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 driver dan riwayat lokasi

Lacak karyawan mana yang ditugaskan ke kendaraan mana dan riwayat lokasi mereka:

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:

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 geozone

Identifikasi kendaraan mana yang memasuki geozone tertentu:

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
        -- Konversi koordinat dari integer 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;

Kueri ini menggunakan fungsi spasial PostGIS. Jika Anda mengalami kesalahan, verifikasilah bahwa ekstensi PostGIS diaktifkan di basis data Anda.

Tips optimisasi kinerja

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

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

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

Hindari ini (memindai seluruh tabel)

SELECT * FROM raw_telematics_data.tracking_data_core;
  1. Manfaatkan indeks: Basis data memiliki indeks pada (device_id, device_time) pasangan. Strukturkan kueri Anda untuk menggunakan indeks ini bila memungkinkan.

  2. Gunakan join secara selektif: Gabungkan tabel hanya bila diperlukan dan cobalah memfilter data sebelum menggabungkan tabel besar.

  3. Konversi integer yang diskalakan: Ingat bahwa data koordinat disimpan sebagai integer yang diskalakan. Konversikan hanya di SELECT akhir, bukan di klausa WHERE.

  4. Batasi set hasil: Selalu gunakan LIMIT untuk kueri eksplorasi agar tidak mengembalikan jutaan baris.

SELECT * FROM raw_telematics_data.tracking_data_core 
WHERE device_time > (CURRENT_DATE - INTERVAL '1 day')
LIMIT 1000;
  1. Manfaatkan hubungan hierarkis: Strukturkan kueri kompleks mengikuti hierarki entitas (dealer → client → user/device → object) untuk join dan penyaringan yang lebih efisien.

  2. 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 timeout.

Langkah selanjutnya

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

Last updated

Was this helpful?