(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo agrupar datos por tiempo en KQL: paso a paso

João Barros 05 de July de 2026 4 min de lectura

Agrupar datos en intervalos de tiempo es la base de cualquier análisis en tiempo real: convierte miles de eventos sueltos en una línea temporal legible, lista para gráficos y alertas. En KQL (Kusto Query Language) — el lenguaje de Real-Time Analytics en Microsoft Fabric y de Azure Data Explorer — esta tarea se reduce a dos funciones sencillas: summarize y bin(). Esta guía muestra cómo agrupar lecturas de sensores en ventanas de tiempo, desde el ejemplo más básico hasta el gráfico final.

Requisitos previos

  • Acceso a una base de datos KQL en Microsoft Fabric (Real-Time Analytics) o a un clúster de Azure Data Explorer.
  • Una tabla con al menos una columna de tipo datetime. En este ejemplo usamos la tabla Leituras, con las columnas Timestamp, Sensor y Valor.
  • Nociones básicas de consultas: saber que en KQL los pasos se encadenan con el operador pipe (|).

Paso 1: Filtrar la ventana de tiempo

Antes de agrupar, conviene limitar la consulta al periodo que interesa. Así la consulta es más rápida y el gráfico no se llena de datos antiguos. La función ago() devuelve un momento del pasado a partir de ahora; aquí pedimos solo las últimas 24 horas.

Leituras
| where Timestamp > ago(24h)

El resultado siguen siendo las filas en bruto, una por lectura. Es el punto de partida para la agrupación.

Paso 2: Agrupar con summarize y bin()

La función bin() redondea cada fecha y hora al inicio de la ventana a la que pertenece. Por ejemplo, bin(Timestamp, 15m) convierte 10:07 y 10:14 en 10:00, y 10:22 en 10:15. El operador summarize usa ese valor para juntar todas las lecturas de la misma ventana y calcular una métrica — en este caso, la media.

Leituras
| where Timestamp > ago(24h)
| summarize MediaValor = avg(Valor) by bin(Timestamp, 15m)

Ahora cada fila representa una ventana de 15 minutos con su media. Pasamos de miles de lecturas a decenas de puntos.

Consejo: el segundo argumento de bin() acepta cualquier duración — 1m, 5m, 1h, 1d. Empieza amplio (1h) y redúcelo solo cuando necesites más detalle.

Paso 3: Agrupar por sensor y por tiempo

Muchas veces queremos la evolución por cada sensor, y no la media global. Basta con añadir la columna Sensor a la cláusula by. KQL crea entonces una ventana por cada combinación de sensor e intervalo.

Leituras
| where Timestamp > ago(24h)
| summarize MediaValor = avg(Valor) by Sensor, bin(Timestamp, 15m)

El orden en la cláusula by no cambia el cálculo, pero ayuda a leer la tabla.

Paso 4: Calcular varias métricas y ordenar

Una sola consulta puede calcular varios valores por ventana. Aquí combinamos la media, el máximo y el número de lecturas, y ampliamos la ventana a 1 hora. Al final, ordenamos por tiempo para que la línea temporal quede correcta.

Leituras
| where Timestamp > ago(24h)
| summarize
    MediaValor = avg(Valor),
    MaxValor   = max(Valor),
    NLeituras  = count()
    by bin(Timestamp, 1h)
| order by Timestamp asc

Fíjate en que count() no necesita argumentos: cuenta las filas de cada ventana.

Paso 5: Convertir en gráfico

Para ver la tendencia de inmediato, añade el operador render. El tipo timechart asume que la primera columna es la temporal y dibuja una línea por métrica.

Leituras
| where Timestamp > ago(24h)
| summarize MediaValor = avg(Valor) by bin(Timestamp, 1h)
| render timechart

En Real-Time Analytics, este gráfico puede ir directamente a un panel (dashboard) y actualizarse solo.

Comprobar el resultado

Para confirmar que la agrupación es correcta, comprueba tres cosas: (1) los valores de la columna de tiempo están siempre al inicio de la ventana (por ejemplo, minutos 00, 15, 30, 45 para ventanas de 15m); (2) no existe ningún Timestamp en el futuro; y (3) el número de ventanas tiene sentido — 24 horas en ventanas de 1 hora dan, como máximo, 24 filas por sensor. Si aparecen intervalos que faltan, es porque no hubo lecturas en ese periodo — normal con datos reales.

Conclusión

Con summarize y bin() ya puedes convertir datos en bruto en una serie temporal lista para analizar. El siguiente paso natural es usar make-series para rellenar automáticamente las ventanas sin datos (útil para gráficos continuos) y, más adelante, crear alertas cuando la media supere un umbral. ¿Cuál sería la ventana de tiempo ideal para tus datos: 5 minutos, 1 hora o 1 día?