{"slug":"why-relative-volume-differs-between-platforms","qid":"side_by_side","label":"Five relative-volume definitions on one AAPL session, at 10:30 a.m. ET and at the close","post_title":"Why Relative Volume Differs Between Platforms","post_url":"/blog/why-relative-volume-differs-between-platforms#q-side_by_side","columns":["definition","at_10_30_et_ratio","at_close_ratio"],"rows":[{"definition":"Full-day basis, 63-session (3-month) average","at_10_30_et_ratio":0.38,"at_close_ratio":1.54},{"definition":"Full-day basis, 50-session average","at_10_30_et_ratio":0.4,"at_close_ratio":1.62},{"definition":"Full-day basis, 10-session average","at_10_30_et_ratio":0.46,"at_close_ratio":1.87},{"definition":"Same-time basis, 50-session average","at_10_30_et_ratio":1.52,"at_close_ratio":1.62},{"definition":"Same-time basis, 10-session average","at_10_30_et_ratio":1.92,"at_close_ratio":1.87}],"shape":"ranking","sql":"WITH toDate('2026-09-10') AS session_day\nSELECT\n    tupleElement(r, 1)           AS definition,\n    round(tupleElement(r, 2), 2) AS at_10_30_et_ratio,\n    round(tupleElement(r, 3), 2) AS at_close_ratio\nFROM\n(\n    SELECT\n        arrayJoin([\n            ('Full-day basis, 63-session (3-month) average', session_1030 / avg63_full, session_close / avg63_full, 1),\n            ('Full-day basis, 50-session average',           session_1030 / avg50_full, session_close / avg50_full, 2),\n            ('Full-day basis, 10-session average',           session_1030 / avg10_full, session_close / avg10_full, 3),\n            ('Same-time basis, 50-session average',          session_1030 / avg50_same, session_close / avg50_full, 4),\n            ('Same-time basis, 10-session average',          session_1030 / avg10_same, session_close / avg10_full, 5)\n        ]) AS r\n    FROM\n    (\n        SELECT\n            anyIf(cum_1030, d = session_day)                                                                    AS session_1030,\n            anyIf(cum_close, d = session_day)                                                                   AS session_close,\n            arrayReverseSort(x -> tupleElement(x, 1), groupArrayIf((d, cum_1030, cum_close), d < session_day)) AS prior,\n            arrayAvg(x -> tupleElement(x, 3), arraySlice(prior, 1, 63))                                        AS avg63_full,\n            arrayAvg(x -> tupleElement(x, 3), arraySlice(prior, 1, 50))                                        AS avg50_full,\n            arrayAvg(x -> tupleElement(x, 3), arraySlice(prior, 1, 10))                                        AS avg10_full,\n            arrayAvg(x -> tupleElement(x, 2), arraySlice(prior, 1, 50))                                        AS avg50_same,\n            arrayAvg(x -> tupleElement(x, 2), arraySlice(prior, 1, 10))                                        AS avg10_same\n        FROM\n        (\n            SELECT\n                d,\n                sumIf(vol, minute_of_day <= 630) AS cum_1030,\n                sum(vol)                          AS cum_close\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 - 100, '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        HAVING length(prior) >= 63 AND session_close > 0\n    )\n)\nORDER BY tupleElement(r, 4)","computed_at":"2026-09-16T14:57:17.832969+00:00","elapsed":0.179820479}