{"slug":"dividend-income-tracker-with-sql","qid":"declared_rates","label":"Latest declared dividend per share for each sample holding","post_title":"Build a Dividend Income Tracker With SQL","post_url":"/blog/dividend-income-tracker-with-sql#q-declared_rates","columns":["ticker","cash_per_payment","annual_per_share","payment_count_per_year","last_declared"],"rows":[{"ticker":"O","cash_per_payment":0.2715,"annual_per_share":3.26,"payment_count_per_year":12,"last_declared":"Sep 30, 2026"},{"ticker":"JNJ","cash_per_payment":1.34,"annual_per_share":5.36,"payment_count_per_year":4,"last_declared":"Aug 25, 2026"},{"ticker":"PG","cash_per_payment":1.0885,"annual_per_share":4.35,"payment_count_per_year":4,"last_declared":"Jul 24, 2026"},{"ticker":"XOM","cash_per_payment":1.03,"annual_per_share":4.12,"payment_count_per_year":4,"last_declared":"Aug 17, 2026"},{"ticker":"MSFT","cash_per_payment":0.98,"annual_per_share":3.92,"payment_count_per_year":4,"last_declared":"Nov 19, 2026"},{"ticker":"KO","cash_per_payment":0.53,"annual_per_share":2.12,"payment_count_per_year":4,"last_declared":"Sep 15, 2026"}],"shape":"table","sql":"WITH holdings AS\n(\n    SELECT\n        tupleElement(h, 1) AS ticker,\n        tupleElement(h, 2) AS shares,\n        tupleElement(h, 3) AS cost_per_share\n    FROM\n    (\n        SELECT arrayJoin([\n            ('KO',   200.0,  54.10),\n            ('PG',    60.0, 141.25),\n            ('JNJ',   50.0, 155.40),\n            ('MSFT',  40.0, 268.75),\n            ('XOM',   80.0,  96.20),\n            ('O',    150.0,  61.85)\n        ]) AS h\n    )\n),\ndeclared AS\n(\n    SELECT\n        ticker,\n        argMax(cash_amount, ex_dividend_date)              AS cash_per_payment,\n        argMax(frequency, ex_dividend_date)                AS pays_per_year,\n        formatDateTime(max(ex_dividend_date), '%b %e, %Y') AS last_ex_label\n    FROM global_markets.stocks_dividends\n    WHERE ticker IN ('KO', 'PG', 'JNJ', 'MSFT', 'XOM', 'O')\n      AND currency = 'USD'\n      AND frequency IN (1, 2, 4, 12)\n      AND ex_dividend_date >= today() - 400\n      AND ex_dividend_date <= today() + 120\n    GROUP BY ticker\n)\nSELECT\n    h.ticker                                                    AS ticker,\n    round(toFloat64(d.cash_per_payment), 4)                     AS cash_per_payment,\n    round(toFloat64(d.cash_per_payment) * d.pays_per_year, 2)   AS annual_per_share,\n    toUInt16(d.pays_per_year)                                   AS payment_count_per_year,\n    d.last_ex_label                                             AS last_declared\nFROM holdings AS h\nINNER JOIN declared AS d ON d.ticker = h.ticker\nORDER BY payment_count_per_year DESC, annual_per_share DESC","computed_at":"2026-10-08T16:11:57.376526+00:00","elapsed":0.055303332}