RUNNING_VARP: from Tableau to SQL

Calculates varp over the current and preceding regional marks, excluding null revenues. Below, 8 sample rows go through the calculation and through the SQL, and both return the same numbers.

Calculated field

RUNNING_VARP(SUM([Revenue]))

Compute using: addressing Period; partitioning Region

Sample data

RegionPeriodRevenueCost
Harbor112070
Harbor2180100
Harbor3180120
Harbor4240140
Upland19050
Upland2150110
Upland3null90
Upland4330190

The same calculation as SQL

SELECT CAST((var_pop("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.

Result

RegionPeriodRevenueCostresult
Harbor1120700
Harbor2180100900
Harbor3180120800
Harbor42401401800
Upland190500
Upland2150110900
Upland3null90900
Upland433019010400

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((var_pop("Revenue") OVER ( ORDER BY "Period" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS DOUBLE) AS result FROM input ORDER BY "Region", "Period"
    RegionPeriodRevenueCostresult
    Harbor1120700
    Harbor21801001400
    Harbor31801201224
    Harbor42401402300
    Upland19050225
    Upland21501101125
    Upland3null901224
    Upland43301905510.2

    Matches the calculation

    SELECT CAST((var_pop("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"
    RegionPeriodRevenueCostresult
    Harbor1120700
    Harbor2180100900
    Harbor3180120800
    Harbor42401401800
    Upland190500
    Upland2150110900
    Upland3null90900
    Upland433019010400

Signature

RUNNING_VARP(expression)