RANK_MODIFIED: from Tableau to SQL

Ranks regional mark revenues with the documented tie rule and excludes null measures. Below, 8 sample rows go through the calculation and through the SQL, and both return the same numbers.

Calculated field

RANK_MODIFIED(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((CASE WHEN "Revenue" IS NULL THEN NULL ELSE rank() OVER (PARTITION BY "Region" ORDER BY "Revenue" DESC NULLS LAST) + count("Revenue") OVER (PARTITION BY "Region", "Revenue") - 1 END) AS DOUBLE) AS result FROM input ORDER BY "Region", "Period"

Runs the example above.

Result

RegionPeriodRevenueCostresult
Harbor1120704
Harbor21801003
Harbor31801203
Harbor42401401
Upland190503
Upland21501102
Upland3null90null
Upland43301901

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((CASE WHEN "Revenue" IS NULL THEN NULL ELSE rank() OVER ( ORDER BY "Revenue" DESC NULLS LAST) + count("Revenue") OVER (PARTITION BY "Revenue") - 1 END) AS DOUBLE) AS result FROM input ORDER BY "Region", "Period"
    RegionPeriodRevenueCostresult
    Harbor1120706
    Harbor21801004
    Harbor31801204
    Harbor42401402
    Upland190507
    Upland21501105
    Upland3null90null
    Upland43301901

    Matches the calculation

    SELECT CAST((CASE WHEN "Revenue" IS NULL THEN NULL ELSE rank() OVER (PARTITION BY "Region" ORDER BY "Revenue" DESC NULLS LAST) + count("Revenue") OVER (PARTITION BY "Region", "Revenue") - 1 END) AS DOUBLE) AS result FROM input ORDER BY "Region", "Period"
    RegionPeriodRevenueCostresult
    Harbor1120704
    Harbor21801003
    Harbor31801203
    Harbor42401401
    Upland190503
    Upland21501102
    Upland3null90null
    Upland43301901

Signature

RANK_MODIFIED(expression, [order])