# Consultas comuns

Ao se conectar ao banco de dados, você poderá recuperar dados por meio de consultas SQL. Esta seção fornece exemplos de consultas SQL para ajudá-lo a começar a trabalhar com o Private Telematics Lakehouse. Estes exemplos demonstram como acessar e analisar dados da **Dados brutos** camada, que contém dados brutos de negócios e telemática com transformação mínima.

{% hint style="danger" %}
Observação: devido ao banco de dados conter uma enorme quantidade de informações, certifique-se de fazer consultas de teste com base em um número limitado de valores recuperados.
{% endhint %}

## Consultas básicas

### Recuperar informações básicas do objeto

Esta consulta retorna informações sobre objetos (veículos/ativos) em seu sistema:

```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;
```

### Obter as localizações mais recentes dos dispositivos

Recupere os dados de localização mais recentes de todos os seus dispositivos:

```sql
SELECT
    t.device_id,
    o.object_label,
    -- Converter coordenadas inteiras escalonadas de volta para o formato decimal
    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" %}
Os valores de coordenadas são armazenados como inteiros escalonados por 10^7 para melhorar a eficiência de armazenamento no TimescaleDB. Ao consultar, divida por 10000000 para converter de volta para o formato decimal padrão.
{% endhint %}

## Unindo dados de negócios e telemáticos

### Relatório de atividade do veículo

Esta consulta gera um resumo diário de atividades ao unir dados de negócios e telemáticos:

```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);
```

### Atribuições de motoristas e histórico de localização

Acompanhe quais funcionários foram atribuídos a quais veículos e seu histórico de localização:

```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;
```

## Analisando dados de sensores

### Rastreamento do nível de combustível

Esta consulta mostra como analisar dados do sensor de combustível:

```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;
```

## Análise geoespacial

### Veículos em geozonas

Identifique quais veículos entraram em geozonas específicas:

```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
        -- Calcular se o ponto está dentro da zona circular
        -- Converter coordenadas de inteiros escalonados para decimal
        (
            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" %}
Esta consulta usa funções espaciais do PostGIS. Se você encontrar erros, verifique se a extensão PostGIS está habilitada em seu banco de dados.
{% endhint %}

## Dicas de otimização de desempenho

Ao trabalhar com o Cloud Data Warehouse, considere estas técnicas de otimização:

1. **Use filtragem por tempo**: Sempre inclua um filtro de tempo na `device_time` ou `record_added_at` colunas para limitar os dados analisados.\
   **Boa prática**:

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

**Evite isto** (varre a tabela inteira)

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

2. **Aproveite índices**: O banco de dados possui índices nas `(device_id, device_time)` duplas. Estruture suas consultas para usar esses índices sempre que possível.
3. **Use joins seletivamente**: Faça join de tabelas apenas quando necessário e tente filtrar os dados antes de unir tabelas grandes.
4. **Conversão de inteiros escalonados**: Lembre-se de que os dados de coordenadas são armazenados como inteiros escalonados. Converta somente no SELECT final, não nas cláusulas WHERE.
5. **Limite os conjuntos de resultados**: Use sempre LIMIT em consultas exploratórias para evitar retornar milhões de linhas.

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

6. **Utilize relacionamentos hierárquicos**: Estruture consultas complexas seguindo a hierarquia de entidades (**dealer → client → user/device → object**) para joins e filtragem mais eficientes.
7. **Gerencie as conexões adequadamente**: Feche as conexões com o banco de dados quando não estiverem em uso, especialmente em ferramentas de BI ou scripts agendados, para evitar bloqueio de recursos ou problemas de timeout.

## Próximos passos

Estes exemplos fornecem um ponto de partida para trabalhar com seus dados. À medida que você se familiarizar mais com o esquema, poderá desenvolver consultas mais complexas para atender às suas necessidades específicas de negócios.


---

# 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/pt-br/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.
