Calculated field
RUNNING_SUM(SUM([Revenue]))
Compute using: addressing Period; partitioning Region
Sample data
| Region | Period | Revenue | Cost |
|---|---|---|---|
| Harbor | 1 | 120 | 70 |
| Harbor | 2 | 180 | 100 |
| Harbor | 3 | 180 | 120 |
| Harbor | 4 | 240 | 140 |
| Upland | 1 | 90 | 50 |
| Upland | 2 | 150 | 110 |
| Upland | 3 | null | 90 |
| Upland | 4 | 330 | 190 |
The same calculation as SQL
SELECT CAST((sum("Revenue") OVER (PARTITION BY "Region" ORDER BY "Period" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS DOUBLE) AS result FROM input ORDER BY "Region", "Period"Runs the example above.
SELECT CAST((sum("Revenue") OVER (PARTITION BY "Region" ORDER BY "Period" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS DOUBLE) AS result FROM input ORDER BY "Region", "Period"Written for this dialect; not run here.
SELECT CAST((sum(`Revenue`) OVER (PARTITION BY `Region` ORDER BY `Period` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS FLOAT64) AS result FROM input ORDER BY `Region`, `Period`
Written for this dialect; not run here.
Result
| Region | Period | Revenue | Cost | result |
|---|---|---|---|---|
| Harbor | 1 | 120 | 70 | 120 |
| Harbor | 2 | 180 | 100 | 300 |
| Harbor | 3 | 180 | 120 | 480 |
| Harbor | 4 | 240 | 140 | 720 |
| Upland | 1 | 90 | 50 | 90 |
| Upland | 2 | 150 | 110 | 240 |
| Upland | 3 | null | 90 | 240 |
| Upland | 4 | 330 | 190 | 570 |
Same rows from the calculation and from the SQL in DuckDB.
Where a naive translation goes wrong
- Omitting the region partition allows a calculation to consume marks from other regions.
Naive SQL
SELECT CAST((sum("Revenue") OVER ( ORDER BY "Period" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS DOUBLE) AS result FROM input ORDER BY "Region", "Period"Region Period Revenue Cost result Harbor 1 120 70 120 Harbor 2 180 100 390 Harbor 3 180 120 720 Harbor 4 240 140 960 Upland 1 90 50 210 Upland 2 150 110 540 Upland 3 null 90 720 Upland 4 330 190 1290 Matches the calculation
SELECT CAST((sum("Revenue") OVER (PARTITION BY "Region" ORDER BY "Period" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS DOUBLE) AS result FROM input ORDER BY "Region", "Period"Region Period Revenue Cost result Harbor 1 120 70 120 Harbor 2 180 100 300 Harbor 3 180 120 480 Harbor 4 240 140 720 Upland 1 90 50 90 Upland 2 150 110 240 Upland 3 null 90 240 Upland 4 330 190 570
Signature
RUNNING_SUM(expression)