Aggregazione e Downsampling
Per impostazione predefinita un widget riceve righe non elaborate: ogni record che corrisponde ai suoi filtri, dal più recente, fino al limite di righe. È esattamente ciò che serve per una tabella delle ultime letture, ed esattamente ciò che non serve per un grafico degli ultimi sei mesi — un sensore che campiona ogni secondo produce 15 milioni di righe in quella finestra, di cui un grafico largo 600 pixel può disegnarne forse 600.
L’aggregazione risolve entrambi i problemi in un colpo solo. Il database del progetto raggruppa i record corrispondenti in bucket temporali, calcola un valore per ogni bucket e invia al widget soltanto quei valori. Un anno di dati diventa qualche centinaio di punti, e domande a cui i dati grezzi non sanno rispondere — temperatura media per ora, record per macchina, energia totale di oggi — diventano normale configurazione del widget.
Tutto avviene nel database, prima che i dati raggiungano il browser. Nel widget non viene calcolato nulla, così i widget aggregati restano live e restano rapidi indipendentemente da quanta cronologia hanno alle spalle.
Come attivarla
L’aggregazione si trova nella stessa finestra di dialogo dei filtri — quella che si apre dall’icona filtro accanto a un’associazione dati. Vedi Associazione Dati per la finestra nel suo insieme.
Al suo interno, la sezione Aggregazione offre due scelte:
- Righe non elaborate — l’impostazione predefinita: i record vengono restituiti così come sono memorizzati.
- Aggregato nel tempo — i record vengono raggruppati e ridotti a un valore per gruppo.
Passando ad Aggregato nel tempo compaiono un selettore Metodo e, dove applicabile, i controlli sulla dimensione dei bucket descritti più avanti. Poiché ogni aggregato ha bisogno di un intervallo di tempo su cui operare, attivare l’aggregazione imposta anche una finestra mobile predefinita sulle ultime 24 ore se il widget non aveva ancora una finestra temporale — puoi regolarla nella sezione Finestra temporale mobile subito sopra.
Metodi
| Metodo | Risultato per bucket | Applicabile a |
|---|---|---|
| Media | Media aritmetica dei valori | Colonne numeriche |
| Somma | Totale dei valori | Colonne numeriche |
| Conteggio | Numero di record con un valore | Qualsiasi colonna |
| Minimo | Valore più piccolo | Colonne numeriche, di testo e timestamp |
| Massimo | Valore più grande | Le stesse di cui sopra |
| Primo valore | Valore del record più vecchio nel bucket | Qualsiasi colonna |
| Ultimo valore | Valore del record più recente nel bucket | Qualsiasi colonna |
Un solo metodo si applica a tutte le colonne di valore di una singola serie di dati. Per mostrare più statistiche della stessa misura — ad esempio una banda minimo/massimo con una linea di media — aggiungi una serie di dati per ogni statistica. Condividono un’unica query al database, quindi le serie aggiuntive non costano richieste in più.
Media, Somma, Minimo e Massimo richiedono una colonna che contenga numeri. Puntarli a una colonna di testo o booleana viene rifiutato con un messaggio esplicativo. Conteggio funziona su qualsiasi cosa, il che ne fa il metodo per le domande del tipo “quanti record”.
Che cosa viene aggregato
Non elenchi mai esplicitamente le colonne da aggregare — la piattaforma le deriva dalla mappatura dei campi che hai già configurato per il widget:
| Ruolo del campo | Significato sotto aggregazione |
|---|---|
x = tsp | Il grafico ha un asse temporale: i bucket suddividono la finestra temporale. |
| x = qualsiasi altra colonna | Il grafico ha un asse categoriale: quella colonna raggruppa i record. |
| pivot | Divide il risultato in una serie per ogni valore distinto, aggregata separatamente. |
| y, r e gli altri campi di valore | Aggregati con il metodo selezionato. |
Questo significa che la stessa mappatura che usi per le righe non elaborate continua a funzionare: mappa x sul timestamp e y su temperature, attiva l’aggregazione e il grafico traccia la temperatura media per bucket invece di ogni singola lettura.
Le tre forme di un widget aggregato
1. Serie temporale con risoluzione automatica
Il caso più comune: x è mappato su tsp e la modalità dei bucket resta su Automatico — adattato alla risoluzione del widget. La piattaforma sceglie allora la dimensione dei bucket in base alla larghezza con cui il widget viene renderizzato — un grafico largo 600 pixel non riceve mai più di circa 600 punti, qualunque sia la finestra temporale. Allarga la finestra da un giorno a un anno e i bucket diventano semplicemente più ampi; la quantità di dati che attraversa la rete resta costante.
Scegli questa modalità quando la dimensione del bucket non ha un significato proprio e vuoi solo un grafico di tendenza leggibile e veloce: “temperatura nell’ultimo mese”.
Ridimensionare un widget provoca un nuovo caricamento alla nuova risoluzione, ma solo quando la larghezza supera una soglia — i piccoli trascinamenti non generano richieste.
2. Serie temporale con dimensione fissa dei bucket
Seleziona Dimensione fissa dell’intervallo e indica una durata e un’unità — ogni 1 ora, ogni 15 minuti, ogni 6 ore. Usala ogni volta che l’intervallo fa parte della domanda invece di essere un dettaglio di visualizzazione: “pezzi prodotti all’ora”, “energia consumata al giorno”.
I bucket fissi sono allineati a confini naturali nel fuso orario del tuo browser: i bucket da 6 ore iniziano alle 00:00, 06:00, 12:00 e 18:00 ora locale; quelli giornalieri si interrompono alla mezzanotte locale; quelli settimanali iniziano il lunedì.
Se la dimensione scelta producesse più bucket di quanti un grafico possa ragionevolmente mostrare (il tetto è 2000), la piattaforma allarga automaticamente i bucket a un multiplo di quanto richiesto — bucket da un minuto su una settimana intera diventano bucket da cinque minuti — invece di rifiutare la query. La finestra di dialogo ti avvisa quando succede e indica quale dimensione viene effettivamente usata.
3. Un valore per categoria
Mappa x su una colonna invece che sul timestamp — un nome di macchina, un tipo di prodotto, un sito — e il widget diventa un riepilogo per categoria: l’intera finestra temporale viene trattata come un unico bucket e ogni valore distinto di quella colonna produce esattamente una riga aggregata.
Questa è la forma adatta a “record per macchina oggi” o “tempo ciclo medio per linea di produzione questa settimana”. Non c’è alcuna dimensione dei bucket da scegliere — la finestra di dialogo lo indica invece di mostrare i controlli sull’intervallo.
Contare i record: il numero di righe di un gruppo è Conteggio applicato alla colonna timestamp tsp, dato che ogni record ne ha una. Mappa y su tsp e la piattaforma seleziona automaticamente Conteggio — è l’unico aggregato consentito da una colonna timestamp.
x → machine_name (raggruppa i record)
y → tsp (conteggiato → numero di record)
Metodo: Conteggio
Finestra: ultimo 1 giornoIl risultato è una barra per macchina che mostra quanti record quella macchina ha prodotto nell’ultimo giorno.
Valori singoli aggregati
Le associazioni scalari — il valore di un riquadro KPI, di un gauge, di un campo di testo — offrono la stessa scelta in una sezione Valore:
- Ultimo valore — il valore del record più recente, come prima.
- Aggregato su una finestra temporale — un unico valore calcolato sull’intera finestra.
Usala per i numeri di sintesi in tempo reale: “pezzi prodotti oggi” (Conteggio su tsp con una finestra di 1 giorno), “temperatura media di questo turno”, “picco di potenza di questo mese”. Nemmeno qui c’è una dimensione dei bucket — la finestra è il bucket. Il valore si aggiorna man mano che arrivano nuovi record, quindi a differenza di un numero incollato nel widget non diventa mai obsoleto.
Filtri, finestre e aggregazione insieme
Le sezioni della finestra di dialogo si applicano nell’ordine in cui sono mostrate, che è anche l’ordine in cui le applica il database:
- Finestra temporale mobile / finestra temporale personalizzata — seleziona il periodo.
- Filtri — selezionano quali record all’interno di quel periodo partecipano.
- Aggregazione — riduce i record selezionati a un valore per bucket.
- Limite righe — una rete di sicurezza, vedi sotto.
Poiché i filtri agiscono prima dell’aggregazione, restringono ciò che entra in ciascun bucket. machine = 'A' combinato con medie orarie dà la media oraria della macchina A. I filtri collegati a widget filtro o a segmenti di routing funzionano esattamente come per le righe non elaborate, quindi un grafico aggregato segue un menu a tendina o l’URL di una pagina come qualsiasi altro widget.
Anche i widget calendario si combinano: quando l’utente sceglie un intervallo di date, quell’intervallo sostituisce la finestra mobile e l’aggregazione lo segue.
Aggancio della finestra
Quando l’aggregazione è attiva, l’inizio della finestra si aggancia alla griglia dei bucket in modo che i bucket stessi restino fermi con il passare del tempo — senza questo, ogni aggiornamento sposterebbe leggermente tutti i confini dei bucket e l’intero grafico tremolerebbe. La finestra di dialogo lo segnala con “La finestra si sposta in passi di …”, e l’anteprima di inizio/fine risolti mostra sempre l’intervallo effettivamente interrogato.
La fine della finestra non viene mai estesa: una finestra che termina adesso continua a terminare adesso, e una finestra che termina un’ora fa non arriva mai dentro quell’ultima ora.
Il limite righe sotto aggregazione
Il Limite righe resta visibile ma cambia ruolo: il numero di bucket viene derivato dalla dimensione del widget o dall’intervallo fisso che hai impostato, non da questo campo. Si applica solo se un widget deve ripiegare sulle righe non elaborate — ad esempio su un’istanza self-hosted la cui versione della piattaforma precede l’aggregazione. Lasciarlo su un valore sensato mantiene utilizzabile un widget del genere.
Buchi nei dati
Un bucket in cui nessun record ha corrisposto viene omesso dal risultato, non restituito come zero. Per una media questa è la risposta onesta — non esiste la media del nulla — ma per un grafico di Conteggio di un evento intermittente significa che un grafico a linee traccia una linea retta attraverso il periodo di silenzio invece di scendere a zero. I grafici a barre mostrano il buco in modo naturale; con i grafici a linee, tieni presente la differenza tra “nessun dato” e “zero”.
Aggiornamenti live
I widget aggregati restano live. Man mano che arrivano i record, i bucket interessati vengono ricalcolati e il widget si aggiorna — al massimo una volta ogni pochi secondi, così un dispositivo che pubblica ad alta frequenza non può sommergere la board. Poiché il bucket più recente di solito si sta ancora riempiendo, il suo valore continua a cambiare finché il bucket non si chiude; è un comportamento atteso ed è il motivo per cui l’ultimo punto di un grafico live è spesso più basso dei vicini con Conteggio e Somma.
Prestazioni e cronologie lunghe
L’aggregazione su una finestra lunga deve comunque leggere i record che stanno dietro. Per le tabelle che alimentano abitualmente grafici su finestre lunghe, un’app può dichiarare il downsampling continuo nel proprio schema dati — vedi downsample nel riferimento del Data Backend. La piattaforma mantiene allora una copia pre-aggregata della tabella e risponde da quella alle query su finestre lunghe, tipicamente con ordini di grandezza in più di velocità, e può conservare quella cronologia sottocampionata più a lungo dei dati grezzi stessi — così un grafico può ancora mostrare due anni di medie orarie dopo che i record grezzi sono stati eliminati.
Tutto questo è completamente trasparente per la board: la configurazione del widget non cambia e le query a cui la copia pre-aggregata non può rispondere (intervalli molto fini, filtri su colonne per cui non raggruppa) ricadono automaticamente sulla tabella grezza.
Limitazioni
- L’aggregazione si applica alle tabelle, non alle tabelle di trasformazione. Aggrega invece la tabella sottostante, oppure pre-aggrega nell’SQL della trasformazione stessa.
- Un solo metodo per serie di dati. Usa più serie di dati per più statistiche di una stessa colonna.
- I timestamp si aggregano solo con Conteggio. La
Mediadi un timestamp non è significativa e viene rifiutata. - Un asse categoriale e un asse temporale si escludono a vicenda per una stessa serie di dati — un grafico è o “nel tempo” o “per categoria”. Per ottenere entrambi (medie orarie per macchina), tieni
xsutspe metti la colonna della macchina in pivot. - I campi JSON possono essere aggregati come colonne normali, ma solo i campi che l’app ha dichiarato per il downsampling beneficiano della copia pre-aggregata; gli altri vengono calcolati dalla tabella grezza.
Ricette
| Cosa vuoi | x | y | Metodo | Intervallo |
|---|---|---|---|---|
| Andamento della temperatura su un mese | tsp | temperature | Media | Automatico |
| Pezzi prodotti all’ora | tsp | tsp | Conteggio | Fisso, 1 ora |
| Energia consumata al giorno | tsp | kwh | Somma | Fisso, 1 giorno |
| Picco di potenza all’ora, per macchina | tsp | power (+ pivot machine) | Massimo | Fisso, 1 ora |
| Record per macchina oggi | machine | tsp | Conteggio | — (categoria) |
| Tempo ciclo medio per linea questa settimana | line | cycle_time | Media | — (categoria) |
| Pezzi prodotti oggi (riquadro KPI) | — | tsp | Conteggio | — (valore singolo) |
Riepilogo
- Porta un’associazione da Righe non elaborate ad Aggregato nel tempo nella finestra di dialogo dei filtri per far calcolare i valori al database invece di trasferire i record.
- Con
xsul timestamp ottieni una serie temporale — risoluzione automatica per le tendenze, intervallo fisso quando è l’intervallo stesso la domanda. - Con
xsu un’altra colonna ottieni un valore per categoria; con un’associazione scalare ottieni un unico numero live. - Il Conteggio sulla colonna
tspè il modo per contare i record. - I filtri si applicano prima dell’aggregazione; i bucket vuoti vengono omessi; il limite righe diventa una salvaguardia di riserva.
- Per le cronologie lunghe, le app possono dichiarare
downsampleaffinché la piattaforma serva i grafici da una copia pre-aggregata e possa conservare quella cronologia oltre la finestra di conservazione dei dati grezzi.