Running Aggregates
Running aggregates compute a cumulative or rolling value across the rows of a table or chart, in sort order. Unlike standard aggregates (which collapse all rows into a single value), running aggregates keep each row but add a column showing how the value accumulates.
Running aggregates are used in output components — they are configured in the Output Designer, not in the blueprint.
Available running aggregate types
| Function | Description | Common use |
|---|---|---|
running_sum | Cumulative sum of the field's values in sort order | Cumulative spend, cumulative progress |
running_avg | Cumulative average up to and including each row | Rolling average trend, moving baseline |
running_count | Cumulative count of non-null values in sort order | Cumulative actions closed, cumulative risks opened |
running_min | Minimum value seen so far in sort order | Running floor / best-case value |
running_max | Maximum value seen so far in sort order | Running peak / worst-case value |
Where running aggregates can be used
Running aggregates are available in:
| Component type | Use case |
|---|---|
| Table — as an additional column | Show cumulative spend alongside period spend in each row |
| Line chart — as an additional series | Overlay a cumulative trend line on a period-by-period bar |
| Bar chart — as a secondary series | Add a running total line to a grouped bar chart |
| Calculated field in output | Reference the running aggregate in an expression for a KPI or annotation |
Running aggregates are not available in:
- KPI card value fields (which collapse to a single value by definition)
- Gauge and indicator components
- RAG grid components
Configuring a running aggregate in a table
Step 1 — Open the table component in Output Designer
- Open the blueprint → Output Designer → select the output template.
- Click the Table component on the canvas.
- Open the Data panel on the right.
Step 2 — Add a running aggregate column
- In the Columns list, click + Add column.
- In the column type selector, choose Running aggregate.
- Configure:
| Setting | Description |
|---|---|
| Header label | Column header text (e.g. "Cumulative Spend") |
| Source field | The numeric field to aggregate (e.g. Period Cost) |
| Aggregate type | running_sum, running_avg, running_count, running_min, or running_max |
| Sort field | The field that defines the accumulation order (e.g. Period Date, Week, Row number) |
| Sort direction | Ascending (default) or Descending |
| Reset on group | If grouping is active, reset the running total at each group boundary (see below) |
| Format | Number format — same options as the source field's format panel |
- Click Apply.
The column appears in the table preview with live values.
Configuring a running aggregate series in a chart
Step 1 — Open a line or bar chart component
- Click the chart component on the canvas.
- Open the Series panel.
Step 2 — Add the running aggregate series
- Click + Add series.
- Set Series type to Line (for a bar chart, this creates a combo bar+line chart).
- Set Value source to Running aggregate.
- Configure:
| Setting | Description |
|---|---|
| Source field | The numeric field to aggregate |
| Aggregate type | running_sum, running_avg, running_count, running_min, or running_max |
| Sort axis | The dimension axis the chart is sorted by (typically the X-axis date or period field) |
| Y-axis | Primary or secondary axis (use secondary to keep scale readable when the running total is much larger than period values) |
- Style the series: colour, line style (solid, dashed), line width, and show/hide data point markers.
Sort order dependency
Running aggregates are order-dependent — the same data produces different running values depending on the sort order.
Example: running_sum of Period Cost
| Period | Period Cost | running_sum (asc date) | running_sum (desc date) |
|---|---|---|---|
| Jan | 100 | 100 | 600 |
| Feb | 150 | 250 | 500 |
| Mar | 200 | 450 | 350 |
| Apr | 150 | 600 | 150 |
Always set the Sort field explicitly. If the sort field is ambiguous (e.g. rows have the same date), the running aggregate result is non-deterministic.
If your table or chart does not have a stable sort order, running aggregate values will be inconsistent. Set an explicit sort field on the component — and if the component allows multi-level sort, add a tie-breaker (e.g. row ID) as the secondary sort.
Interaction with grouping
When a table or chart has grouping enabled (e.g. grouped by Discipline or Month), running aggregates can behave in two ways depending on the Reset on group setting:
| Reset on group | Behaviour |
|---|---|
| On (default) | The running aggregate resets to zero at the start of each group. Produces a per-group running total. |
| Off | The running aggregate continues across groups — producing a workspace-wide running total that ignores group boundaries. |
Example — Cost by Discipline (grouped by Discipline, Reset on group: On):
| Discipline | Period Cost | running_sum |
|---|---|---|
| Civil | 100 | 100 |
| Civil | 200 | 300 |
| Structural | 150 | 150 ← resets at group change |
| Structural | 100 | 250 |
Same data (Reset on group: Off):
| Discipline | Period Cost | running_sum |
|---|---|---|
| Civil | 100 | 100 |
| Civil | 200 | 300 |
| Structural | 150 | 450 ← continues from previous group |
| Structural | 100 | 550 |
Filter interaction
Running aggregates respect the component's active filters. If a filter excludes certain rows, those rows are not included in the accumulation. The running aggregate only runs across the visible (unfiltered) rows.
Example: If a table filters Period = "2026" and the data includes 2025 rows, the running total starts from the first 2026 row — it does not include 2025 values.
This is the expected and correct behaviour. If you need a cumulative total that includes prior periods not visible in the current filter, use an expression-based calculated field referencing a separate unfiltered data source.
Running average vs. simple average
| Concept | Description |
|---|---|
running_avg | Average of all values seen so far in sort order. Changes with each row. |
Standard Average aggregate | Single value: average of all rows in the data source. Same for every row. |
Use running_avg when you want to show how the average improves or deteriorates over time. Use standard Average in a KPI card or table footer when you want a single summary value.
Performance considerations
Running aggregates add a computation step to output rendering. For tables with:
- < 500 rows: No perceptible performance impact.
- 500–2000 rows: Minor rendering delay (< 1 second).
- > 2000 rows: Consider whether running aggregates are the right tool — at this scale, pre-aggregated data in a blueprint computed field may render faster.
Related
- Running Aggregates Reference — formal syntax, reset behaviour, and edge case definitions
- Running Aggregates Tutorial — step-by-step: cumulative cost trend + rolling average overlay
- Output Designer Overview
- Parameters and Calculated Fields — expression-based alternatives to running aggregates