{"slug":"upcoming-ex-dividend-dates","qid":"worked_example","label":"Three household payers at their last ex-date: prior close, ex-morning open, and the payment for scale","post_title":"Upcoming Ex-Dividend Dates: Stocks This Week","post_url":"/blog/upcoming-ex-dividend-dates#q-worked_example","columns":["ticker","last_ex_date","last_ex_label","dividend_usd","close_before_ex_usd","ex_morning_open_usd","open_gap_pct","dividend_pct_of_price"],"rows":[{"ticker":"KO","last_ex_date":"2026-06-15","last_ex_label":"Jun 15","dividend_usd":0.53,"close_before_ex_usd":82.6,"ex_morning_open_usd":81.08,"open_gap_pct":-1.84,"dividend_pct_of_price":0.64},{"ticker":"VZ","last_ex_date":"2026-07-10","last_ex_label":"Jul 10","dividend_usd":0.7075,"close_before_ex_usd":42.22,"ex_morning_open_usd":41.61,"open_gap_pct":-1.46,"dividend_pct_of_price":1.68},{"ticker":"XOM","last_ex_date":"2026-08-17","last_ex_label":"Aug 17","dividend_usd":1.03,"close_before_ex_usd":160.09,"ex_morning_open_usd":160.1,"open_gap_pct":0.01,"dividend_pct_of_price":0.64}],"shape":"series","sql":"WITH last_ex AS (\n    SELECT ticker,\n           max(ex_dividend_date) AS ex_d,\n           argMax(cash_amount, ex_dividend_date) AS div_amt\n    FROM global_markets.stocks_dividends\n    WHERE ticker IN ('KO', 'VZ', 'XOM')\n      AND cash_amount > 0\n      AND distribution_type = 'recurring'\n      AND ex_dividend_date < today()\n      AND ex_dividend_date >= today() - 120\n    GROUP BY ticker\n),\ndaily AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n           argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS close_px,\n           argMinIf(toFloat64(open), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS open_px,\n           countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS bars\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('KO', 'VZ', 'XOM')\n      AND window_start >= toDateTime(today() - 130)\n    GROUP BY ticker, d\n    HAVING bars > 200\n),\nseq AS (\n    SELECT ticker, d, open_px, close_px,\n           lagInFrame(close_px, 1) OVER (PARTITION BY ticker ORDER BY d ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS pre_close\n    FROM daily\n)\nSELECT s.ticker AS ticker,\n       toString(e.ex_d) AS last_ex_date,\n       formatDateTime(e.ex_d, '%b %e') AS last_ex_label,\n       round(e.div_amt, 4) AS dividend_usd,\n       round(s.pre_close, 2) AS close_before_ex_usd,\n       round(s.open_px, 2) AS ex_morning_open_usd,\n       round(100 * (s.open_px - s.pre_close) / s.pre_close, 2) AS open_gap_pct,\n       round(100 * e.div_amt / s.pre_close, 2) AS dividend_pct_of_price\nFROM seq s\nJOIN last_ex e ON e.ticker = s.ticker AND e.ex_d = s.d\nWHERE s.pre_close > 0\nORDER BY ticker","computed_at":"2026-08-25T13:00:11.376514+00:00","elapsed":1.065956965}