Comeback Kings
For each team, the longest consecutive run of league matches where they were losing at half-time but came back to win
Consecutive Comebacks
Bars are to scale · longest streak at top · hover for dates and opponents
Every Team's Longest Streak
#TeamMatchesSeason(s)First matchLast matchOpponents
1Arsenal22001-0226 Dec 200129 Dec 2001Chelsea, Middlesbrough
2Aston Villa22024-2514 Sep 202421 Sep 2024Everton, Wolverhampton Wanderers
3Brighton and Hove Albion22024-2519 May 202525 May 2025Liverpool, Tottenham Hotspur
4Liverpool22008-0905 Oct 200818 Oct 2008Manchester City, Wigan Athletic
5Manchester United21993-9430 Oct 199307 Nov 1993Queens Park Rangers, Manchester City
6Newcastle United22001-0215 Dec 200118 Dec 2001Blackburn Rovers, Arsenal
7Norwich City21992-9315 Aug 199219 Aug 1992Arsenal, Chelsea
8Reading22012-1312 Jan 201319 Jan 2013West Bromwich Albion, Newcastle United
9Sheffield United21993-9428 Mar 199402 Apr 1994West Ham United, Liverpool
10Tottenham Hotspur22010-1120 Nov 201028 Nov 2010Arsenal, Liverpool
11Wolverhampton Wanderers22019-2021 Dec 201927 Dec 2019Norwich City, Manchester City
12Birmingham City12002-0321 Apr 200321 Apr 2003Southampton
13Blackburn Rovers11994-9515 Oct 199415 Oct 1994Liverpool
14Bolton Wanderers12004-0515 May 200515 May 2005Everton
15Bournemouth12016-1704 Dec 201604 Dec 2016Liverpool
16Brentford12021-2210 Dec 202110 Dec 2021Watford
17Burnley12009-1009 May 201009 May 2010Tottenham Hotspur
18Cardiff City12013-1401 Feb 201401 Feb 2014Norwich City
19Charlton Athletic11998-9924 Oct 199824 Oct 1998West Ham United
20Chelsea11993-9407 May 199407 May 1994Sheffield United
21Coventry City11993-9418 Aug 199318 Aug 1993Newcastle United
22Crystal Palace11992-9312 Dec 199212 Dec 1992Queens Park Rangers
23Derby County11996-9701 Mar 199701 Mar 1997Chelsea
24Everton11992-9303 Mar 199303 Mar 1993Blackburn Rovers
25Fulham12002-0311 Sep 200211 Sep 2002Tottenham Hotspur
26Hull City12009-1008 Nov 200908 Nov 2009Stoke City
27Ipswich Town11992-9312 Dec 199212 Dec 1992Manchester City
28Leeds United11992-9309 Jan 199309 Jan 1993Southampton
29Leicester City11999-0003 Oct 199903 Oct 1999Tottenham Hotspur
30Manchester City11992-9321 Nov 199221 Nov 1992Coventry City
31Middlesbrough11992-9305 Dec 199205 Dec 1992Blackburn Rovers
32Nottingham Forest11996-9719 Jan 199719 Jan 1997Tottenham Hotspur
33Portsmouth12004-0504 Dec 200404 Dec 2004West Bromwich Albion
34Queens Park Rangers11992-9319 Aug 199219 Aug 1992Southampton
35Sheffield Wednesday11996-9722 Feb 199722 Feb 1997Southampton
36Southampton11992-9313 Mar 199313 Mar 1993Ipswich Town
37Stoke City12009-1020 Feb 201020 Feb 2010Portsmouth
38Sunderland11999-0025 Aug 199925 Aug 1999Newcastle United
39Swansea City12012-1307 May 201307 May 2013Wigan Athletic
40Watford12017-1814 Oct 201714 Oct 2017Arsenal
41West Bromwich Albion12010-1118 Sep 201018 Sep 2010Birmingham City
42West Ham United11995-9616 Dec 199516 Dec 1995Southampton
43Wigan Athletic12009-1018 Apr 201018 Apr 2010Arsenal
44Wimbledon11993-9429 Mar 199429 Mar 1994Blackburn Rovers
SQL Query Used
-- Longest consecutive run of matches where each team was losing at half-time but came back to win
copy (
    with team_games as (
        select
            match_id,
            season_label,
            kickoff_at,
            home_team_abbr as team_abbr,
            home_team_name as team_name,
            away_team_abbr as opponent_abbr,
            away_team_name as opponent_name,
            home_half_time_score as ht_goals_for,
            away_half_time_score as ht_goals_against,
            result = 'home_win' as is_win
        from "premier_league"."main"."fct_matches"
        union all
        select
            match_id,
            season_label,
            kickoff_at,
            away_team_abbr as team_abbr,
            away_team_name as team_name,
            home_team_abbr as opponent_abbr,
            home_team_name as opponent_name,
            away_half_time_score as ht_goals_for,
            home_half_time_score as ht_goals_against,
            result = 'away_win' as is_win
        from "premier_league"."main"."fct_matches"
    ),
    games_ranked as (
        select
            *,
            row_number() over (
                partition by team_abbr
                order by kickoff_at, match_id
            ) as rn
        from team_games
    ),
    flagged as (
        select
            *,
            rn - row_number() over (
                partition by team_abbr
                order by kickoff_at, match_id
            ) as grp
        from games_ranked
        where ht_goals_for < ht_goals_against and is_win
    ),
    runs as (
        select
            team_abbr,
            min(team_name) as team_name,
            min(season_label) as start_season,
            max(season_label) as end_season,
            count(*) as run_length,
            min(kickoff_at) as start_at,
            max(kickoff_at) as end_at,
            grp
        from flagged
        group by team_abbr, grp
    ),
    ranked_runs as (
        select
            *,
            row_number() over (
                partition by team_abbr
                order by run_length desc, start_at, team_name
            ) as rn
        from runs
    ),
    final as (
        select * from ranked_runs where rn = 1
    )
    select
        f.team_name,
        f.team_abbr,
        f.run_length,
        case
            when f.start_season = f.end_season then f.start_season
            else f.start_season || ' → ' || f.end_season
        end as seasons,
        date(f.start_at) as start_date,
        date(f.end_at) as end_date,
        (
            select string_agg(w.opponent_name, ', ' order by w.kickoff_at, w.match_id)
            from flagged w
            where w.team_abbr = f.team_abbr and w.grp = f.grp
        ) as opponents
    from final f
    order by f.run_length desc, f.team_name
)
to 'assets/data/comeback_kings.csv' (header, delimiter ',')