Longest No-Win Streaks After HT Lead
For each team, the longest consecutive run of league matches where they led at half-time but still failed to win
Consecutive Matches
Bars are to scale · longest streak at top · hover for dates and opponents
Every Team's Longest Streak
#TeamMatchesSeason(s)First matchLast matchOpponents
1Crystal Palace32018-1912 Jan 201930 Jan 2019Watford, Liverpool, Southampton
2Manchester City31992-9309 Apr 199318 Apr 1993Sheffield United, Liverpool, Aston Villa
3Newcastle United31999-0015 Aug 199925 Aug 1999Southampton, Wimbledon, Sunderland
4Sheffield Wednesday31995-9618 Nov 199525 Nov 1995Manchester City, Arsenal, Everton
5Sunderland32012-1301 Sep 201222 Sep 2012Swansea City, Liverpool, West Ham United
6Wolverhampton Wanderers32010-1128 Aug 201018 Sep 2010Newcastle United, Fulham, Tottenham Hotspur
7Arsenal22019-2027 Oct 201902 Nov 2019Crystal Palace, Wolverhampton Wanderers
8Aston Villa22000-0125 Nov 200002 Dec 2000Coventry City, Newcastle United
9Birmingham City22004-0521 Nov 200427 Nov 2004Blackburn Rovers, Norwich City
10Blackburn Rovers21994-9515 Apr 199517 Apr 1995Leeds United, Manchester City
11Bolton Wanderers22009-1026 Dec 200929 Dec 2009Burnley, Hull City
12Bournemouth22022-2329 Oct 202205 Nov 2022Tottenham Hotspur, Leeds United
13Brentford22024-2518 May 202525 May 2025Fulham, Wolverhampton Wanderers
14Brighton and Hove Albion22024-2526 Oct 202402 Nov 2024Wolverhampton Wanderers, Liverpool
15Burnley22009-1007 Nov 200921 Nov 2009Manchester City, Aston Villa
16Charlton Athletic22002-0321 Dec 200226 Dec 2002Birmingham City, Tottenham Hotspur
17Chelsea21994-9501 Apr 199510 Apr 1995Newcastle United, Wimbledon
18Coventry City21997-9823 Aug 199727 Aug 1997Bolton Wanderers, West Ham United
19Derby County22001-0220 Oct 200128 Oct 2001Charlton Athletic, Chelsea
20Everton21993-9403 Oct 199316 Oct 1993Tottenham Hotspur, Swindon Town
21Fulham22007-0818 Aug 200725 Aug 2007Middlesbrough, Aston Villa
22Ipswich Town21992-9303 Apr 199306 Apr 1993Manchester City, Chelsea
23Leicester City21994-9526 Nov 199403 Dec 1994Norwich City, Aston Villa
24Liverpool21994-9526 Nov 199403 Dec 1994Tottenham Hotspur, Coventry City
25Manchester United21998-9912 Dec 199816 Dec 1998Tottenham Hotspur, Chelsea
26Middlesbrough21998-9924 Oct 199801 Nov 1998Wimbledon, Nottingham Forest
27Norwich City22019-2028 Dec 201901 Jan 2020Tottenham Hotspur, Crystal Palace
28Nottingham Forest22022-2303 Sep 202216 Sep 2022Bournemouth, Fulham
29Queens Park Rangers21993-9427 Nov 199304 Dec 1993Tottenham Hotspur, Aston Villa
30Reading22012-1327 Oct 201204 Nov 2012Fulham, Queens Park Rangers
31Sheffield United22019-2024 Nov 201901 Dec 2019Manchester United, Wolverhampton Wanderers
32Southampton21992-9312 Sep 199219 Sep 1992Queens Park Rangers, Leeds United
33Stoke City22009-1031 Oct 200908 Nov 2009Wolverhampton Wanderers, Hull City
34Swansea City22013-1402 Mar 201415 Mar 2014Crystal Palace, West Bromwich Albion
35Tottenham Hotspur21994-9503 May 199506 May 1995Newcastle United, Queens Park Rangers
36West Bromwich Albion22002-0321 Dec 200226 Dec 2002Sunderland, Arsenal
37West Ham United21994-95 → 1995-9614 May 199519 Aug 1995Manchester United, Leeds United
38Wigan Athletic22009-1006 Feb 201009 Feb 2010Sunderland, Stoke City
39Wimbledon21996-9718 Mar 199723 Mar 1997West Ham United, Newcastle United
40Barnsley11997-9809 Aug 199709 Aug 1997West Ham United
41Blackpool12010-1127 Nov 201027 Nov 2010Bolton Wanderers
42Bradford City11999-0008 Jan 200008 Jan 2000Chelsea
43Cardiff City12013-1428 Dec 201328 Dec 2013Sunderland
44Huddersfield Town12017-1826 Nov 201726 Nov 2017Manchester City
45Hull City12008-0921 Sep 200821 Sep 2008Everton
46Leeds United11992-9324 Mar 199324 Mar 1993Chelsea
47Luton Town12023-2410 Dec 202310 Dec 2023Manchester City
48Oldham Athletic11992-9319 Aug 199219 Aug 1992Crystal Palace
49Portsmouth12004-0502 Oct 200402 Oct 2004Norwich City
50Swindon Town11993-9429 Dec 199329 Dec 1993Sheffield Wednesday
51Watford11999-0006 Nov 199906 Nov 1999Sheffield Wednesday
SQL Query Used
-- Longest consecutive run of matches where each team led at half-time but failed 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 not 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/ht_lead_no_win_streaks.csv' (header, delimiter ',')