Agregación y submuestreo
Por defecto, un widget recibe filas sin procesar: cada registro que coincide con sus filtros, del más reciente al más antiguo, hasta el límite de filas. Eso es exactamente lo correcto para una tabla con las últimas lecturas, y exactamente lo incorrecto para un gráfico de los últimos seis meses — un sensor que muestrea cada segundo produce 15 millones de filas en esa ventana, de las que un gráfico de 600 píxeles de ancho puede dibujar unas 600.
La agregación resuelve ambos problemas a la vez. La base de datos del proyecto agrupa los registros coincidentes en intervalos de tiempo, calcula un valor por intervalo y envía al widget solo esos valores. Un año de datos se convierte en unos cientos de puntos, y preguntas que los datos en bruto no pueden responder — temperatura media por hora, registros por máquina, energía total de hoy — se convierten en simple configuración del widget.
Todo ocurre en la base de datos, antes de que los datos lleguen al navegador. Nada se calcula en el widget, así que los widgets agregados siguen siendo rápidos y en vivo por mucho historial que tengan detrás.
Cómo activarla
La agregación vive en el mismo diálogo que los filtros — el que se abre con el icono de filtro junto a un enlace de datos. Vea Enlace de datos para el diálogo en su conjunto.
Dentro, la sección Agregación ofrece dos opciones:
- Filas sin procesar — el valor por defecto: los registros se devuelven tal como están almacenados.
- Agregado en el tiempo — los registros se agrupan y se reducen a un valor por grupo.
Al cambiar a Agregado en el tiempo aparece un selector de Método y, cuando corresponde, los controles de tamaño de intervalo descritos más abajo. Como toda agregación necesita un rango temporal sobre el que trabajar, activarla también rellena una ventana de tiempo móvil por defecto de las últimas 24 horas si el widget aún no tenía ventana temporal — ajústela en la sección Ventana de tiempo móvil, justo encima.
Métodos
| Método | Resultado por intervalo | Funciona sobre |
|---|---|---|
| Promedio | Media aritmética de los valores | Columnas numéricas |
| Suma | Total de los valores | Columnas numéricas |
| Recuento | Número de registros con valor | Cualquier columna |
| Mínimo | Valor más pequeño | Columnas numéricas, de texto y de marca temporal |
| Máximo | Valor más grande | Cualquiera de las anteriores |
| Primer valor | Valor del registro más antiguo del intervalo | Cualquier columna |
| Último valor | Valor del registro más reciente del intervalo | Cualquier columna |
Un método se aplica a todas las columnas de valor de una misma serie de datos. Para mostrar varias estadísticas de la misma medición — por ejemplo, una banda de mínimo/máximo con una línea de promedio — añada una serie de datos por estadística. Comparten una única consulta a la base de datos, así que las series adicionales no cuestan peticiones.
Promedio, Suma, Mínimo y Máximo requieren una columna que contenga números. Apuntarlos a una columna de texto o booleana se rechaza con un mensaje explicativo. Recuento funciona sobre cualquier cosa, lo que lo convierte en el método para las preguntas del tipo “cuántos registros”.
Qué se agrega
Nunca se enumeran explícitamente las columnas de la agregación — la plataforma las deriva del mapeo de campos que ya configuró para el widget:
| Rol del campo | Significado bajo agregación |
|---|---|
x = tsp | El gráfico tiene un eje temporal: los intervalos subdividen la ventana de tiempo. |
| x = cualquier otra columna | El gráfico tiene un eje de categorías: esa columna agrupa los registros. |
| pivot | Divide el resultado en una serie por cada valor distinto, agregada por separado. |
| y, r y otros campos de valor | Se agregan con el método seleccionado. |
Esto significa que el mismo mapeo que usa para filas sin procesar sigue funcionando: mapee x a la marca temporal e y a temperature, active la agregación, y el gráfico traza la temperatura media por intervalo en lugar de cada lectura individual.
Las tres formas de un widget agregado
1. Serie temporal con resolución automática
El caso más habitual: x está mapeado a tsp y el modo de intervalo se deja en Automático — se ajusta a la resolución del widget. La plataforma elige entonces el tamaño de intervalo a partir del ancho renderizado del widget — un gráfico de 600 píxeles de ancho nunca recibe más de unos 600 puntos, sea cual sea la ventana de tiempo. Amplíe la ventana de un día a un año y los intervalos simplemente se ensanchan; la cantidad de datos que cruza la red se mantiene constante.
Elija esta opción cuando el tamaño del intervalo no aporte significado por sí mismo y solo quiera un gráfico rápido y legible de una tendencia: “temperatura del último mes”.
Redimensionar un widget vuelve a consultar con la nueva resolución, pero solo cuando el ancho cruza un escalón — los arrastres pequeños no disparan peticiones.
2. Serie temporal con tamaño de intervalo fijo
Seleccione Tamaño de intervalo fijo e indique una duración y una unidad — cada 1 hora, cada 15 minutos, cada 6 horas. Use esto siempre que el intervalo forme parte de la pregunta y no sea un simple detalle de visualización: “unidades producidas por hora”, “energía consumida por día”.
Los intervalos fijos se alinean con límites naturales en la zona horaria de su navegador: los intervalos de 6 horas empiezan a las 00:00, 06:00, 12:00 y 18:00 hora local; los diarios cortan a medianoche local; los semanales empiezan en lunes.
Si el tamaño elegido produjera más intervalos de los que un gráfico puede mostrar razonablemente (el tope son 2000), la plataforma ensancha automáticamente los intervalos a un múltiplo del que pidió — los intervalos de un minuto sobre una semana completa pasan a ser de cinco minutos — en lugar de rechazar la consulta. El diálogo le indica cuándo ocurre esto y qué tamaño se usa realmente.
3. Un valor por categoría
Mapee x a una columna en lugar de a la marca temporal — un nombre de máquina, un tipo de producto, una planta — y el widget se convierte en un resumen por categorías: toda la ventana de tiempo se trata como un único intervalo, y cada valor distinto de esa columna produce exactamente una fila agregada.
Esta es la forma adecuada para “registros por máquina hoy” o “tiempo de ciclo medio por línea de producción esta semana”. No hay tamaño de intervalo que elegir — el diálogo lo indica en lugar de mostrar los controles de intervalo.
Contar registros: el número de filas de un grupo es Recuento aplicado a la columna de marca temporal tsp, ya que todo registro tiene una. Mapee y a tsp y la plataforma selecciona Recuento automáticamente — es la única agregación que permite una columna de marca temporal.
x → machine_name (agrupa los registros)
y → tsp (contado → número de registros)
Método: Recuento
Ventana: último 1 díaEl resultado es una barra por máquina que muestra cuántos registros produjo esa máquina en el último día.
Valores únicos agregados
Los enlaces escalares — el valor de una tarjeta KPI, un indicador, un campo de texto — ofrecen la misma elección en una sección Valor:
- Último valor — el valor del registro más reciente, como hasta ahora.
- Agregado en una ventana de tiempo — un único valor calculado sobre toda la ventana.
Úselo para cifras destacadas en vivo: “unidades producidas hoy” (Recuento sobre tsp con una ventana de 1 día), “temperatura media de este turno”, “potencia máxima de este mes”. Aquí tampoco hay tamaño de intervalo — la ventana es el intervalo. El valor se refresca conforme llegan nuevos registros, así que, a diferencia de un número pegado en el widget, nunca queda obsoleto.
Filtros, ventanas y agregación en conjunto
Las secciones del diálogo se aplican en el orden en que se muestran, que es también el orden en que las aplica la base de datos:
- Ventana de tiempo móvil / rango temporal personalizado — selecciona el periodo.
- Filtros — seleccionan qué registros de ese periodo participan.
- Agregación — reduce los registros seleccionados a un valor por intervalo.
- Límite de filas — una red de seguridad, vea más abajo.
Como los filtros se ejecutan antes de la agregación, acotan lo que entra en cada intervalo. machine = 'A' combinado con promedios horarios da el promedio horario de la máquina A. Los filtros enlazados a widgets de filtro o a segmentos de ruta funcionan exactamente igual que con filas sin procesar, así que un gráfico agregado sigue un desplegable o la URL de una página como cualquier otro widget.
Los widgets de calendario también se combinan: cuando el usuario elige un rango de fechas, ese rango sustituye a la ventana móvil y la agregación lo sigue.
Alineación de la ventana
Mientras la agregación está activa, el inicio de la ventana se ajusta a la rejilla de intervalos para que los propios intervalos no se muevan con el paso del tiempo — sin ello, cada refresco desplazaría ligeramente todos los límites de intervalo y el gráfico entero parpadearía. El diálogo lo indica con “La ventana se desplaza en pasos de …”, y la vista previa de inicio/fin resuelto muestra siempre el rango realmente consultado.
El fin de la ventana nunca se extiende: una ventana que termina ahora sigue terminando ahora, y una ventana que terminó hace una hora nunca alcanza esa última hora.
El límite de filas bajo agregación
El Límite de filas sigue visible pero cambia de papel: el número de intervalos se deriva del tamaño del widget o del intervalo fijo que haya elegido, no de este campo. Solo se aplica si un widget tiene que recurrir a filas sin procesar — por ejemplo, en una instancia autoalojada cuya versión de la plataforma es anterior a la agregación. Dejarlo en un valor razonable mantiene utilizable a un widget así.
Huecos en los datos
Un intervalo en el que ningún registro coincidió se omite del resultado, no se devuelve como cero. Para un promedio esa es la respuesta honesta — no existe el promedio de nada — pero para un gráfico de Recuento de un evento intermitente significa que un gráfico de líneas traza una línea recta a través del periodo silencioso en lugar de caer a cero. Los gráficos de barras muestran el hueco de forma natural; en los de líneas, tenga presente la diferencia entre “sin datos” y “cero”.
Actualizaciones en vivo
Los widgets agregados siguen en vivo. Conforme llegan registros, los intervalos afectados se recalculan y el widget se refresca — como mucho una vez cada pocos segundos, de modo que un dispositivo que publica a alta frecuencia no puede inundar el board. Como el intervalo más reciente normalmente aún se está llenando, su valor sigue cambiando hasta que el intervalo se cierra; esto es esperable, y es la razón por la que el último punto de un gráfico en vivo suele ser más bajo que sus vecinos con Recuento y Suma.
Rendimiento e historiales largos
La agregación sobre una ventana larga todavía tiene que leer los registros que hay detrás. Para tablas que habitualmente alimentan gráficos de ventana larga, una app puede declarar submuestreo continuo en su esquema de datos — vea downsample en la referencia del Backend de datos. La plataforma mantiene entonces una copia preagregada de la tabla y responde las consultas de ventana larga desde ella, normalmente órdenes de magnitud más rápido, y puede conservar ese historial submuestreado más tiempo que los propios datos en bruto — de modo que un gráfico todavía puede mostrar dos años de promedios horarios después de que los registros en bruto se hayan eliminado.
Esto es totalmente transparente para el board: la configuración del widget no cambia, y las consultas que la copia preagregada no puede servir (intervalos muy finos, filtros sobre columnas por las que no agrupa) recurren automáticamente a la tabla en bruto.
Limitaciones
- La agregación se aplica a tablas, no a tablas de transformación. Agregue en su lugar la tabla subyacente, o preagregue en el propio SQL de la transformación.
- Un método por serie de datos. Use varias series de datos para varias estadísticas de una misma columna.
- Las marcas temporales solo se agregan con Recuento. El
Promediode una marca temporal no tiene sentido y se rechaza. - Un eje de categorías y un eje temporal son mutuamente excluyentes en una misma serie de datos — un gráfico es “en el tiempo” o “por categoría”. Para obtener ambos (promedios horarios por máquina), mantenga
xentspy ponga la columna de máquina en pivot. - Los campos JSON se pueden agregar como columnas normales, pero solo los campos que la app declaró para el submuestreo se benefician de la copia preagregada; el resto se calcula desde la tabla en bruto.
Recetas
| Lo que quiere | x | y | Método | Intervalo |
|---|---|---|---|---|
| Tendencia de temperatura de un mes | tsp | temperature | Promedio | Automático |
| Unidades producidas por hora | tsp | tsp | Recuento | Fijo, 1 hora |
| Energía consumida por día | tsp | kwh | Suma | Fijo, 1 día |
| Potencia máxima por hora y por máquina | tsp | power (+ pivot machine) | Máximo | Fijo, 1 hora |
| Registros por máquina hoy | machine | tsp | Recuento | — (categoría) |
| Tiempo de ciclo medio por línea esta semana | line | cycle_time | Promedio | — (categoría) |
| Unidades producidas hoy (tarjeta KPI) | — | tsp | Recuento | — (valor único) |
Resumen
- Cambie un enlace de Filas sin procesar a Agregado en el tiempo en el diálogo de filtros para que la base de datos calcule valores en lugar de enviar registros.
- Con
xen la marca temporal obtiene una serie temporal — resolución automática para tendencias, un intervalo fijo cuando el intervalo es la pregunta. - Con
xen otra columna obtiene un valor por categoría; con un enlace escalar obtiene un único número en vivo. - Recuento sobre la columna
tspes la forma de contar registros. - Los filtros se aplican antes de la agregación; los intervalos vacíos se omiten; el límite de filas pasa a ser una salvaguarda de reserva.
- Para historiales largos, las apps pueden declarar
downsamplepara que la plataforma sirva los gráficos desde una copia preagregada y pueda conservar ese historial más allá de la ventana de retención de los datos en bruto.