{"slug":"why-relative-volume-differs-between-platforms","qid":"cumulative_curves","label":"How the session's volume piled up against the prior 10 sessions, checkpoint by checkpoint","post_title":"Why Relative Volume Differs Between Platforms","post_url":"/blog/why-relative-volume-differs-between-platforms#q-cumulative_curves","columns":["et_time","session_cumulative_millions","typical_cumulative_millions","typical_share_of_session_pct"],"rows":[{"et_time":"09:45","session_cumulative_millions":8.3,"typical_cumulative_millions":2.7,"typical_share_of_session_pct":8.5},{"et_time":"10:00","session_cumulative_millions":11.1,"typical_cumulative_millions":4.5,"typical_share_of_session_pct":14.1},{"et_time":"10:30","session_cumulative_millions":14.5,"typical_cumulative_millions":7.5,"typical_share_of_session_pct":23.8},{"et_time":"11:00","session_cumulative_millions":19,"typical_cumulative_millions":10.1,"typical_share_of_session_pct":31.9},{"et_time":"11:30","session_cumulative_millions":23.4,"typical_cumulative_millions":12.4,"typical_share_of_session_pct":39.2},{"et_time":"12:00","session_cumulative_millions":29.2,"typical_cumulative_millions":14.5,"typical_share_of_session_pct":45.7},{"et_time":"12:30","session_cumulative_millions":32.8,"typical_cumulative_millions":16.3,"typical_share_of_session_pct":51.4},{"et_time":"13:00","session_cumulative_millions":38.2,"typical_cumulative_millions":17.7,"typical_share_of_session_pct":55.8},{"et_time":"13:30","session_cumulative_millions":41.2,"typical_cumulative_millions":19.5,"typical_share_of_session_pct":61.5},{"et_time":"14:00","session_cumulative_millions":45.3,"typical_cumulative_millions":21,"typical_share_of_session_pct":66.4},{"et_time":"14:30","session_cumulative_millions":48,"typical_cumulative_millions":22.9,"typical_share_of_session_pct":72.4},{"et_time":"15:00","session_cumulative_millions":50.3,"typical_cumulative_millions":25.1,"typical_share_of_session_pct":79.3},{"et_time":"15:30","session_cumulative_millions":53.4,"typical_cumulative_millions":26.9,"typical_share_of_session_pct":85.1},{"et_time":"16:00","session_cumulative_millions":59.3,"typical_cumulative_millions":31.7,"typical_share_of_session_pct":100}],"shape":"series","sql":"WITH\n    toDate('2026-09-10') AS session_day,\n    [585, 600, 630, 660, 690, 720, 750, 780, 810, 840, 870, 900, 930, 960] AS checkpoints\nSELECT\n    formatDateTime(toDateTime(session_day, 'UTC') + checkpoints[i] * 60, '%H:%i', 'UTC') AS et_time,\n    round(session_cums[i] / 1e6, 1)                                                        AS session_cumulative_millions,\n    round(typical_cums[i] / 1e6, 1)                                                        AS typical_cumulative_millions,\n    round(100 * typical_cums[i] / typical_cums[14], 1)                                     AS typical_share_of_session_pct\nFROM\n(\n    SELECT\n        arrayJoin(arrayEnumerate(checkpoints)) AS i,\n        session_cums,\n        arrayMap(k -> arrayAvg(x -> arrayElement(tupleElement(x, 2), k), arraySlice(prior, 1, 10)),\n                 arrayEnumerate(checkpoints)) AS typical_cums\n    FROM\n    (\n        SELECT\n            anyIf(cums, d = session_day)                                                        AS session_cums,\n            arrayReverseSort(x -> tupleElement(x, 1), groupArrayIf((d, cums), d < session_day)) AS prior\n        FROM\n        (\n            SELECT\n                d,\n                arrayMap(cp -> arraySum(x -> if(tupleElement(x, 1) <= cp, tupleElement(x, 2), 0), mv),\n                         checkpoints) AS cums\n            FROM\n            (\n                SELECT d, groupArray((minute_of_day, vol)) AS mv\n                FROM\n                (\n                    SELECT\n                        toDate(toTimeZone(window_start, 'America/New_York'))      AS d,\n                        toHour(toTimeZone(window_start, 'America/New_York')) * 60\n                          + toMinute(toTimeZone(window_start, 'America/New_York')) AS minute_of_day,\n                        max(toFloat64(volume))                                     AS vol\n                    FROM global_markets.delayed_stocks_minute_aggs\n                    WHERE ticker = 'AAPL'\n                      AND window_start >= toDateTime(session_day - 20, 'America/New_York')\n                      AND window_start <  toDateTime(session_day + 1, 'America/New_York')\n                    GROUP BY d, minute_of_day\n                    HAVING minute_of_day >= 570 AND minute_of_day <= 960\n                )\n                GROUP BY d\n            )\n        )\n        HAVING length(session_cums) = 14 AND length(prior) >= 10\n    )\n)\nORDER BY i","computed_at":"2026-09-16T14:57:17.354633+00:00","elapsed":0.108975018}