Team Streak Stats Finder - Hockey
Current Search
Longest streak of consecutive games, from 1917-18 to 2024-25, in the regular season, requiring Wins = 1, sorted by most games matching criteria.
THIS QUESTION WAS ANSWERED USING
POWERED BY
Your All Access Pass to the
Hockey
Database
Go beyond the basics. Become a Stathead
Start Your FREE Trial
Display Query »
--------------------------------------
main
Page Setup Time: 0.00177 seconds
WITH
Meta AS (
SELECT MAX(year_id) as MaxYear, team_id
FROM sup_team_seasons
JOIN sup_phase_seasons USING (comp_id, phase_id, year_id)
WHERE type=?
GROUP BY team_id
),
Gamelog AS (
SELECT year_id, team_id, (win=1) as met_criteria, LAG(win=1) OVER w AS lag_met_criteria, LEAD(win=1) OVER w AS lead_met_criteria, ROW_NUMBER() OVER w AS rn, date, team_game_num_franchise, phase_id
FROM sup_team_games as st
JOIN sup_games USING (game_id)
JOIN sup_phase_seasons USING (comp_id, phase_id, year_id)
WHERE year_id<=?
AND type=?
AND year_id>=?
AND comp_id=?
AND forfeit IS NULL
AND date<current_date()
WINDOW w AS (PARTITION BY team_id ORDER BY date )
),
StreakStart AS (
SELECT ROW_NUMBER() OVER w1 AS rownum, Gamelog.rn as rn_start, date AS streak_start_date, team_id
FROM Gamelog
WHERE met_criteria = 1
AND (lag_met_criteria = 0 OR lag_met_criteria IS NULL)
WINDOW w1 AS (PARTITION BY team_id ORDER BY date )
),
StreakEnd AS (
SELECT ROW_NUMBER() OVER w2 AS rownum, Gamelog.rn as rn_end, date AS streak_end_date, IF(lead_met_criteria IS NULL AND year_id=MaxYear,1,0) AS active_streak, team_id
FROM Gamelog
JOIN Meta USING (team_id)
WHERE met_criteria = 1
AND (lead_met_criteria = 0 OR lead_met_criteria IS NULL)
WINDOW w2 AS (PARTITION BY team_id ORDER BY date )
),
streak_list AS (
SELECT team_id, streak_start_date, streak_end_date, (rn_end - rn_start)+1 as streak_length, active_streak
FROM StreakStart
JOIN StreakEnd USING (team_id, rownum)
WHERE 1
HAVING streak_length>=?
ORDER BY streak_length DESC, streak_end_date DESC LIMIT 0, 20
)
SELECT ts.name_abbr as team_name_abbr, ts.link as team_link, team_id, streak_length, streak_start_date as streak_start_date_csk, streak_start_date as streak_start_date, streak_end_date as streak_end_date_csk, streak_end_date as streak_end_date, active_streak as active_streak_csk, IF(active_streak=1,'*','') as active_streak, 'Games List' as details_games, COUNT(*) AS games, SUM(win=1) AS wins, SUM(loss=1 AND (year_id<2000 OR type="post" OR overtimes=0)) AS losses, SUM(tie=1) AS ties, SUM(year_id>=2000 AND type="reg" AND loss=1 AND overtimes>0) AS losses_ot, SUM(goals) AS goals, SUM(goals_pp) AS goals_pp, SUM(goals_sh) AS goals_sh, SUM(shots) AS shots, SUM(pen_min) AS pen_min, SUM(goals_against) AS goals_against, SUM(goals_against_pp) AS goals_against_pp, SUM(goals_against_sh) AS goals_against_sh, SUM(shots_against) AS shots_against, SUM(opp_pen_min) AS opp_pen_min, SUM(chances_pp) AS chances_pp, SUM(opp_chances_pp) AS opp_chances_pp, SUM(goals) - SUM(goals_against) AS score_differential
FROM streak_list
JOIN sup_team_games as st USING (team_id)
JOIN sup_phase_seasons USING (comp_id, phase_id, year_id)
JOIN sup_comp_seasons USING (comp_id, year_id)
JOIN (SELECT team_id, year_id, name_abbr, name, link FROM sup_team_seasons GROUP BY team_id, year_id ) as ts USING (team_id, year_id)
JOIN sup_games USING (game_id)
WHERE type=?
AND comp_id=?
AND date>=streak_start_date
AND date<=streak_end_date
GROUP BY team_id, streak_start_date, streak_end_date
ORDER BY streak_length DESC, streak_end_date_csk DESC, team_id
SQL PARAMS -- $VAR1 = [
'reg',
2025,
'reg',
1918,
'NHL',
2,
'reg',
'NHL'
];
Query Time: 2.07 seconds
Table Build Time: 0.04 seconds
--------------------------------------
SH->PARAM -- $VAR1 = {
'year_max' => 2025,
'streak_length' => 2,
'team_game_min' => 1,
'order_by' => 'streak_length',
'match' => 'team_streak_game',
'timeframe' => 'seasons',
'team_game_max' => 84,
'comp_type' => 'reg',
'order_by_asc' => '0',
'year_min' => 1918,
'comp_id' => 'NHL'
};
SH->PARAM_NO_DEFAULT -- $VAR1 = {
'order_by' => 'streak_length',
'order_by_asc' => '0',
'year_min' => 1918,
'comp_id' => 'NHL',
'year_max' => 2025
};
--------------------------------------
main
Page Setup Time: 0.00177 seconds
WITH
Meta AS (
SELECT MAX(year_id) as MaxYear, team_id
FROM sup_team_seasons
JOIN sup_phase_seasons USING (comp_id, phase_id, year_id)
WHERE type=?
GROUP BY team_id
),
Gamelog AS (
SELECT year_id, team_id, (win=1) as met_criteria, LAG(win=1) OVER w AS lag_met_criteria, LEAD(win=1) OVER w AS lead_met_criteria, ROW_NUMBER() OVER w AS rn, date, team_game_num_franchise, phase_id
FROM sup_team_games as st
JOIN sup_games USING (game_id)
JOIN sup_phase_seasons USING (comp_id, phase_id, year_id)
WHERE year_id<=?
AND type=?
AND year_id>=?
AND comp_id=?
AND forfeit IS NULL
AND date<current_date()
WINDOW w AS (PARTITION BY team_id ORDER BY date )
),
StreakStart AS (
SELECT ROW_NUMBER() OVER w1 AS rownum, Gamelog.rn as rn_start, date AS streak_start_date, team_id
FROM Gamelog
WHERE met_criteria = 1
AND (lag_met_criteria = 0 OR lag_met_criteria IS NULL)
WINDOW w1 AS (PARTITION BY team_id ORDER BY date )
),
StreakEnd AS (
SELECT ROW_NUMBER() OVER w2 AS rownum, Gamelog.rn as rn_end, date AS streak_end_date, IF(lead_met_criteria IS NULL AND year_id=MaxYear,1,0) AS active_streak, team_id
FROM Gamelog
JOIN Meta USING (team_id)
WHERE met_criteria = 1
AND (lead_met_criteria = 0 OR lead_met_criteria IS NULL)
WINDOW w2 AS (PARTITION BY team_id ORDER BY date )
),
streak_list AS (
SELECT team_id, streak_start_date, streak_end_date, (rn_end - rn_start)+1 as streak_length, active_streak
FROM StreakStart
JOIN StreakEnd USING (team_id, rownum)
WHERE 1
HAVING streak_length>=?
ORDER BY streak_length DESC, streak_end_date DESC LIMIT 0, 20
)
SELECT ts.name_abbr as team_name_abbr, ts.link as team_link, team_id, streak_length, streak_start_date as streak_start_date_csk, streak_start_date as streak_start_date, streak_end_date as streak_end_date_csk, streak_end_date as streak_end_date, active_streak as active_streak_csk, IF(active_streak=1,'*','') as active_streak, 'Games List' as details_games, COUNT(*) AS games, SUM(win=1) AS wins, SUM(loss=1 AND (year_id<2000 OR type="post" OR overtimes=0)) AS losses, SUM(tie=1) AS ties, SUM(year_id>=2000 AND type="reg" AND loss=1 AND overtimes>0) AS losses_ot, SUM(goals) AS goals, SUM(goals_pp) AS goals_pp, SUM(goals_sh) AS goals_sh, SUM(shots) AS shots, SUM(pen_min) AS pen_min, SUM(goals_against) AS goals_against, SUM(goals_against_pp) AS goals_against_pp, SUM(goals_against_sh) AS goals_against_sh, SUM(shots_against) AS shots_against, SUM(opp_pen_min) AS opp_pen_min, SUM(chances_pp) AS chances_pp, SUM(opp_chances_pp) AS opp_chances_pp, SUM(goals) - SUM(goals_against) AS score_differential
FROM streak_list
JOIN sup_team_games as st USING (team_id)
JOIN sup_phase_seasons USING (comp_id, phase_id, year_id)
JOIN sup_comp_seasons USING (comp_id, year_id)
JOIN (SELECT team_id, year_id, name_abbr, name, link FROM sup_team_seasons GROUP BY team_id, year_id ) as ts USING (team_id, year_id)
JOIN sup_games USING (game_id)
WHERE type=?
AND comp_id=?
AND date>=streak_start_date
AND date<=streak_end_date
GROUP BY team_id, streak_start_date, streak_end_date
ORDER BY streak_length DESC, streak_end_date_csk DESC, team_id
SQL PARAMS -- $VAR1 = [
'reg',
2025,
'reg',
1918,
'NHL',
2,
'reg',
'NHL'
];
Query Time: 2.07 seconds
Table Build Time: 0.04 seconds
--------------------------------------
SH->PARAM -- $VAR1 = {
'year_max' => 2025,
'streak_length' => 2,
'team_game_min' => 1,
'order_by' => 'streak_length',
'match' => 'team_streak_game',
'timeframe' => 'seasons',
'team_game_max' => 84,
'comp_type' => 'reg',
'order_by_asc' => '0',
'year_min' => 1918,
'comp_id' => 'NHL'
};
SH->PARAM_NO_DEFAULT -- $VAR1 = {
'order_by' => 'streak_length',
'order_by_asc' => '0',
'year_min' => 1918,
'comp_id' => 'NHL',
'year_max' => 2025
};
Data coverage: NHL all-time (since 1917-18) unless otherwise noted. Even Strength, Power Play, and Short-Handed Goals available since 1933-34. Plus/Minus and Shots available since 1959-60. Time on Ice available since 1998-99.


We're Social...for Statheads
Site Last Updated:
Question, Comment, Feedback, or Correction?
Subscribe to our Free Email Newsletter
Do you have a sports website? Or write about sports? We have tools and resources that can help you use sports data. Find out more.