# Flux

A diferencia de los lenguajes tradicionales de consulta SQL o InfluxQL, Flux es un lenguaje funcional, orientado a la manipulación avanzada de datos y a la integración con múltiples fuentes externas.

## **Estructura de Datos en InfluxDB** <a href="#undefined" id="undefined"></a>

Antes de consultar, es fundamental entender cómo se organizan los datos:

* **Measurement**: Equivalente a una tabla.
* **Tags**: Etiquetas indexadas para búsquedas rápidas.
* **Fields**: Valores medidos, no indexados, pueden ser numéricos, cadenas, booleanos.
* **Time**: Marca de tiempo obligatoria para cada punto de datos.

> **Ejemplo de punto de datos:**
>
> {% code title="text" overflow="wrap" %}
>
> ```
> temperature,location=oficina,device=sensor1 value=23.5 1622470420000000000
> ```
>
> {% endcode %}

## **Comparativa: Flux vs SQL-Like (InfluxQL) y SQL** <a href="#undefined" id="undefined"></a>

InfluxDB 2.x soporta principalmente el lenguaje Flux, aunque existen mecanismos para traducir consultas SQL a InfluxQL o Flux, con ciertas limitaciones.

| Característica                  | SQL                      | InfluxQL                   | Flux                         |
| ------------------------------- | ------------------------ | -------------------------- | ---------------------------- |
| Sintaxis                        | Declarativa, estándar    | Similar a SQL              | Funcional, basada en pipes   |
| Agregaciones                    | Sí (GROUP BY, HAVING)    | Parcial                    | Avanzadas, ventanas, joins   |
| Funciones personalizadas        | Limitado                 | Limitado                   | Sí, con funciones de usuario |
| Integración con otras fuentes   | Sí, mediante extensiones | No                         | Sí, nativo                   |
| Soporte en InfluxDB 2.x         | Parcial, vía traducción  | Parcial                    | Nativo y recomendado         |
| Ventanas y rolling aggregations | Limitado                 | Limitado                   | Sí, muy potente              |
| Aprendizaje                     | Sencillo                 | Sencillo para usuarios SQL | Más complejo, pero flexible  |

### **Conceptos clave de Flux** <a href="#undefined" id="undefined"></a>

* **Lenguaje funcional**: Cada consulta es una composición de funciones que se encadenan mediante el operador `|>`, similar a un pipeline.
* **Transformación avanzada**: Permite filtrar, transformar, unir y agregar datos de forma flexible.

## **Flux: El Lenguaje Avanzado de InfluxDB 2.x** <a href="#undefined" id="undefined"></a>

### **Características Principales**

* Sintaxis funcional y declarativa.
* Permite manipulación avanzada de datos: joins, windowing, pivot, custom functions.
* Puede consultar múltiples fuentes de datos, no solo InfluxDB.

### **Estructura de una Consulta Flux**

* **from()**: Selecciona el bucket (equivalente a la base de datos).
* **range()**: Define el rango de tiempo.
* **filter()**: Filtra por campos o etiquetas.
* **aggregateWindow()**: Realiza agregaciones en ventanas de tiempo.
* **Funciones adicionales**: map, join, pivot, etc.

### **Ejemplo Básico:**

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

```
from(bucket: "sensores")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "temperature" and r.location == "oficina")
  |> aggregateWindow(every: 10m, fn: mean)
```

{% endcode %}

### **Operaciones Avanzadas**

* **Joins**: Combinar datos de diferentes measurements o buckets.
* **Windowing**: Agregaciones móviles y ventanas deslizantes.
* **Funciones definidas por el usuario (UDFs)**: Para cálculos personalizados.
* **Integración con APIs y otras fuentes**.

### Optimización y Buenas Prácticas en Flux <a href="#id-7-optimizacin-y-buenas-prcticas-en-flux" id="id-7-optimizacin-y-buenas-prcticas-en-flux"></a>

* **Filtrar lo antes posible**: Aplica `filter` al inicio para reducir el volumen de datos procesados.
* **Usar `aggregateWindow` para downsampling**: Reduce la cantidad de datos históricos consultados.
* **Evitar joins innecesarios**: Los joins son costosos; úsalos solo cuando sean imprescindibles.


---

# 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.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.
