{"slug":"dividend-growth-champions","qid":"champions","label":"Dividend growth champions: 20+ straight years of raises, ranked by how many times over the payout grew","post_title":"Two Decades of Rising Dividends","post_url":"/blog/dividend-growth-champions#q-champions","columns":["ticker","streak_years","dividend_multiple"],"rows":[{"ticker":"TXN","streak_years":21,"dividend_multiple":61.9},{"ticker":"LOW","streak_years":21,"dividend_multiple":42.7},{"ticker":"MSFT","streak_years":21,"dividend_multiple":42.5},{"ticker":"AIZ","streak_years":21,"dividend_multiple":23.4},{"ticker":"TGT","streak_years":21,"dividend_multiple":19.7},{"ticker":"RHI","streak_years":21,"dividend_multiple":19.7},{"ticker":"LMT","streak_years":21,"dividend_multiple":19.3},{"ticker":"GWW","streak_years":21,"dividend_multiple":14.7},{"ticker":"THG","streak_years":20,"dividend_multiple":14.6},{"ticker":"LHX","streak_years":20,"dividend_multiple":14.1},{"ticker":"MCD","streak_years":21,"dividend_multiple":13},{"ticker":"IBM","streak_years":21,"dividend_multiple":9.6},{"ticker":"PRGO","streak_years":20,"dividend_multiple":7.1},{"ticker":"NOC","streak_years":20,"dividend_multiple":6.8},{"ticker":"ADM","streak_years":21,"dividend_multiple":6.8},{"ticker":"PEP","streak_years":21,"dividend_multiple":6.6},{"ticker":"BDX","streak_years":21,"dividend_multiple":6.6},{"ticker":"SJM","streak_years":21,"dividend_multiple":5.8},{"ticker":"CFR","streak_years":21,"dividend_multiple":5},{"ticker":"JNJ","streak_years":21,"dividend_multiple":4.7}],"shape":"ranking","sql":"WITH annual AS (\n    SELECT ticker,\n           toYear(ex_dividend_date) AS y,\n           round(sum(cash_amount), 4) AS div\n    FROM global_markets.stocks_dividends\n    WHERE frequency IN (1, 2, 4, 12)\n      AND ex_dividend_date >= '2000-01-01'\n      AND ex_dividend_date < toStartOfYear(today())\n    GROUP BY ticker, y\n),\nf AS (\n    SELECT ticker, y, div,\n           lagInFrame(div) OVER w AS prev,\n           lagInFrame(y) OVER w AS prev_y\n    FROM annual\n    WINDOW w AS (PARTITION BY ticker ORDER BY y ASC)\n),\nbrk AS (\n    SELECT ticker, y, div,\n           (prev IS NULL OR div <= prev OR (y - prev_y) > 1) AS is_break\n    FROM f\n)\nSELECT ticker,\n       max(y) - maxIf(y, is_break) AS streak_years,\n       round(argMax(div, y) / argMin(div, y), 1) AS dividend_multiple\nFROM brk\nGROUP BY ticker\nHAVING streak_years >= 20 AND max(y) >= toYear(today()) - 2\nORDER BY dividend_multiple DESC\nLIMIT 20","computed_at":"2026-08-22T04:04:20.580817+00:00","elapsed":1.759905711}