# Sintaxis de Flux

## **Ventajas de Flux**

* Sintaxis expresiva y flexible.
* Posibilidad de manipular datos en tiempo real.
* Integración nativa con InfluxDB 2.x.
* Permite operaciones avanzadas como joins, ventanas temporales y cálculos estadísticos.

## **Estructura Básica de una Consulta Flux** <a href="#undefined" id="undefined"></a>

La estructura general de una consulta en Flux sigue un modelo de *pipeline*, donde los datos fluyen a través de una serie de operadores conectados por el símbolo `|>`.

{% code title="text" overflow="wrap" %}

```
from(bucket: "mi-bucket")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "temperatura" and r.localidad == "Madrid")
  |> mean()
```

{% endcode %}

* **from**: Indica el bucket (contenedor de datos) de origen.
* **range**: Define el intervalo temporal de la consulta.
* **filter**: Filtra los datos según condiciones sobre campos y etiquetas.
* **mean**: Calcula el promedio de los valores filtrados.

## **Tipos de Datos y Variables en Flux** <a href="#undefined" id="undefined"></a>

### **Tipos de Datos**

* Enteros (`int`)
* Flotantes (`float`)
* Booleanos (`bool`)
* Cadenas de texto (`string`)
* Tiempos (`time`)
* Registros (`record`)
* Tablas (`table`)

### **Declaración de Variables**

{% code title="text" overflow="wrap" %}

```
mi_variable = 10
texto = "Hola mundo"
```

{% endcode %}

Las variables pueden almacenar cualquier tipo de dato, incluidos resultados de consultas.

## **Funciones Principales y Operadores** <a href="#undefined" id="undefined"></a>

Flux incorpora una amplia variedad de funciones y operadores para manipular datos:

### **Funciones de Entrada**

* `from(bucket: "nombre")`: Selecciona el bucket de datos.
* `csv.from()`: Importa datos desde un archivo CSV.

### **Operadores de Pipeline**

* `|> range(start: ..., stop: ...)`: Define el rango temporal.
* `|> filter(fn: (r) => ...)`: Filtra filas según una función.
* `|> map(fn: (r) => ...)`: Aplica transformaciones a cada fila.
* `|> group(columns: [...])`: Agrupa datos por columnas.
* `|> aggregateWindow(every: ..., fn: ...)`: Agrega datos en ventanas temporales.

### **Ejemplo de uso de `map`**

{% code title="text" overflow="wrap" %}

```
data
  |> map(fn: (r) => ({ r with _value: r._value * 2 }))
```

{% endcode %}

Esto multiplica por 2 el valor de cada fila.

## **Filtrado y Selección de Datos** <a href="#undefined" id="undefined"></a>

El filtrado se realiza mediante la función `filter` y expresiones lambda:

<pre data-title="text" data-overflow="wrap"><code>|> filter(fn: (r) => r._field == "presion" and r.localidad == "Sevilla")
<strong>|> filter(fn: (r) => r["_field"] == "presion" and r["localidad"] == "Sevilla")
</strong>
</code></pre>

* `r` representa cada registro (fila) de la tabla.
* Se pueden combinar varias condiciones lógicas.

## **Agrupación y Ventanas Temporales** <a href="#undefined" id="undefined"></a>

### **Group**

Permite agrupar los datos por una o más columnas (por ejemplo, por etiqueta de sensor o ubicación):

{% code title="text" overflow="wrap" %}

```
|> group(columns: ["_measurement", "localidad"])
```

{% endcode %}

### **AggregateWindow**

Realiza agregaciones sobre ventanas de tiempo definidas:

{% code title="text" overflow="wrap" %}

```
|> aggregateWindow(every: 10m, fn: mean)
```

{% endcode %}

Esto calcula el promedio cada 10 minutos.

## **Transformaciones y Operaciones Matemáticas** <a href="#undefined" id="undefined"></a>

Flux permite aplicar operaciones matemáticas y transformaciones personalizadas:

{% code title="text" overflow="wrap" %}

```
|> map(fn: (r) => ({ r with _value: (r._value * 1.8) + 32 }))
```

{% endcode %}

Convierte temperaturas de Celsius a Fahrenheit.

## **Funciones de Exploración de Esquema** <a href="#undefined" id="undefined"></a>

Para explorar la estructura de los datos:

{% code title="text" overflow="wrap" %}

```
import "influxdata/influxdb/schema"

schema.measurements(bucket: "mi-bucket")
schema.fieldKeys(bucket: "mi-bucket")
schema.tagKeys(bucket: "mi-bucket")
schema.tagValues(bucket: "mi-bucket", tag: "localidad")
```

{% endcode %}

Estas funciones ayudan a identificar las mediciones, campos y etiquetas disponibles en el bucket.

## **Joins y Combinación de Series** <a href="#undefined" id="undefined"></a>

Flux permite combinar datos de diferentes series temporales:

{% code title="text" overflow="wrap" %}

```
join(
  tables: {t1: tabla1, t2: tabla2},
  on: ["_time", "sensor_id"]
)
```

{% endcode %}

Esto une dos tablas por el tiempo y el identificador del sensor.

### Ejemplo visual:

Supón que tienes:

**tabla1**

| \_time               | sensor\_id | temperatura |
| -------------------- | ---------- | ----------- |
| 2025-06-09T12:00:00Z | S1         | 22.5        |

**tabla2**

| \_time               | sensor\_id | humedad |
| -------------------- | ---------- | ------- |
| 2025-06-09T12:00:00Z | S1         | 60      |

**Resultado del join:**

| \_time               | sensor\_id | t1\_temperatura | t2\_humedad |
| -------------------- | ---------- | --------------- | ----------- |
| 2025-06-09T12:00:00Z | S1         | 22.5            | 60          |

## **Ejemplo Completo de Consulta Flux** <a href="#undefined" id="undefined"></a>

{% code title="flux" overflow="wrap" %}

```
from(bucket: "scada-datos")
  |> range(start: -24h)
  |> filter(fn: (r) => r._measurement == "temperatura" and r.zona == "planta1")
  |> aggregateWindow(every: 1h, fn: mean)
  |> yield(name: "media_horaria")
```

{% endcode %}

Esta consulta obtiene la temperatura media por hora en la zona "planta1" durante las últimas 24 horas.


---

# 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://darioaplicano.gitbook.io/influxdb2.x/sesion-2/guion-de-la-sesion/documentacion/lenguaje-de-consultas-en-influxdb/flux/sintaxis-de-flux.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.
