Player Pitching Streak Stats Finder - Baseball

Find the best (or worst) streaks of games matching your criteria. • Sample SearchesData Coverage
Longest streak of consecutive games, in 2025, in the regular season, requiring Strikeouts >= 9, sorted by most games matching criteria.
THIS QUESTION WAS ANSWERED USING
Stathead Baseball Logo POWERED BY Baseball Reference Logo
Your All Access Pass to the Baseball Database Go beyond the basics. Become a Stathead
Start Your FREE Trial
Display Query »
--------------------------------------

main

Page Setup Time: 0.00249 seconds

WITH
  Meta AS (
SELECT MAX(year_id) as MaxYear, person_id
FROM sup_player_team_seasons
  JOIN sup_phase_seasons USING (comp_id, phase_id, year_id)
WHERE sup_phase_seasons.type=? 
GROUP BY person_id 
  ),
  Gamelog AS (
SELECT person_id, year_id, team_id, (p_so>=9) as met_criteria, LAG(p_so>=9) OVER w AS lag_met_criteria, LEAD(p_so>=9) OVER w AS lead_met_criteria, ROW_NUMBER() OVER w AS rn, CONCAT(`date`,IF(date_game_number,CONCAT(" (",date_game_number,")"),"")) as date, player_game_num_career, phase_id, player_game_num_career_pitch
FROM sup_player_games
  JOIN sup_games USING (game_id)
  JOIN (SELECT game_id, year_id, comp_id, phase_id, team_id, opp_team_id, opp_comp_id, opp_phase_id, team_game_num_season, team_game_num_franchise, home_away_neutral, win, loss, tie FROM sup_team_games) as tg USING (game_id, team_id)
  JOIN sup_phase_seasons USING (comp_id, phase_id, year_id)
WHERE year_id<=?
  AND sup_phase_seasons.type=?
  AND is_pitcher=?
  AND year_id>=? 
WINDOW w AS (PARTITION BY person_id ORDER BY date, date_game_number ) 
  ),
  StreakStart AS (
SELECT ROW_NUMBER() OVER w1 AS rownum, Gamelog.rn as rn_start, date AS streak_start_date, person_id, player_game_num_career AS gn_start, player_game_num_career_pitch AS gn_start_p
FROM Gamelog
WHERE met_criteria = 1
  AND (lag_met_criteria = 0 OR lag_met_criteria IS NULL) 
WINDOW w1 AS (PARTITION BY person_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, person_id, player_game_num_career AS gn_end, player_game_num_career_pitch AS gn_end_p
FROM Gamelog
  JOIN Meta USING (person_id)
WHERE met_criteria = 1
  AND (lead_met_criteria = 0 OR lead_met_criteria IS NULL) 
WINDOW w2 AS (PARTITION BY person_id ORDER BY date ) 
  ),
  streak_list AS (
SELECT person_id, streak_start_date, streak_end_date, (rn_end - rn_start)+1 as streak_length, active_streak
FROM StreakStart
  JOIN StreakEnd USING (person_id, rownum)
WHERE 1 
HAVING streak_length>=?
ORDER BY streak_length DESC, streak_end_date DESC LIMIT 0, 20
  )
SELECT name_display, name_display_csk, sup_players.link as name_display_link, IF(MIN(age_in_season)=MAX(age_in_season), MIN(age_in_season), CONCAT(MIN(age_in_season), '-', MAX(age_in_season))) as age_range, person_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, GROUP_CONCAT(DISTINCT UPPER(ts.name_abbr)) as teams_played_for_career, 'Games List' as details_games, SUM(p_w IS NULL) as p_w_incomplete, SUM(p_w) AS p_w, SUM(p_l IS NULL) as p_l_incomplete, SUM(p_l) AS p_l, SUM(p_s IS NULL) as p_s_incomplete, SUM(p_s) AS p_s, SUM(p_blown_saves IS NULL) as p_blown_saves_incomplete, SUM(p_blown_saves) AS p_blown_saves, SUM(p_cg IS NULL) as p_cg_incomplete, SUM(p_cg) AS p_cg, SUM(p_sho IS NULL) as p_sho_incomplete, SUM(p_sho) AS p_sho, SUM(p_gf IS NULL) as p_gf_incomplete, SUM(p_gf) AS p_gf, SUM(p_ip_outs) as p_ip_csk, SUM(p_ip_outs IS NULL) as p_ip_incomplete, SUM(p_ip_outs) DIV 3 + 0.1 * MOD(SUM(p_ip_outs),3) AS p_ip, SUM(p_w IS NULL)+SUM(p_l IS NULL) as p_decisions_incomplete, SUM(p_w + p_l) AS p_decisions, SUM(p_h IS NULL) as p_h_incomplete, SUM(p_h) AS p_h, SUM(p_r IS NULL) as p_r_incomplete, SUM(p_r) AS p_r, SUM(p_er IS NULL) as p_er_incomplete, SUM(p_er) AS p_er, SUM(p_r IS NULL)+SUM(p_er IS NULL) as p_uer_incomplete, SUM(IF(p_er IS NULL, 0, p_r - p_er)) AS p_uer, SUM(p_hr IS NULL) as p_hr_incomplete, SUM(p_hr) AS p_hr, SUM(p_bb IS NULL) as p_bb_incomplete, SUM(p_bb) AS p_bb, SUM(p_ibb IS NULL) as p_ibb_incomplete, SUM(p_ibb) AS p_ibb, SUM(p_so IS NULL) as p_so_incomplete, SUM(p_so) AS p_so, SUM(p_hbp IS NULL) as p_hbp_incomplete, SUM(p_hbp) AS p_hbp, SUM(p_bk IS NULL) as p_bk_incomplete, SUM(p_bk) AS p_bk, SUM(p_wp IS NULL) as p_wp_incomplete, SUM(p_wp) AS p_wp, SUM(p_bfp IS NULL) as p_bfp_incomplete, SUM(p_bfp) AS p_bfp, SUM(p_bb IS NULL)+SUM(p_h IS NULL)+SUM(p_roe IS NULL)+SUM(p_hbp IS NULL)+SUM(p_reached_on_strikeout IS NULL) as p_baserunners_incomplete, SUM(p_h + IFNULL(p_bb,0) + IFNULL(p_hbp,0) + IFNULL(p_roe,0) + IFNULL(p_reached_on_strikeout,0)) AS p_baserunners, IF(SUM(p_w + p_l), SUM(p_w) / SUM(p_w + p_l), NULL) as p_win_loss_perc_csk, SUM(p_l IS NULL)+SUM(p_w IS NULL) as p_win_loss_perc_incomplete, TRIM(LEADING '0' FROM ROUND(IF(SUM(p_w + p_l), SUM(p_w) / SUM(p_w + p_l), NULL),3)) AS p_win_loss_perc, IF(SUM(p_ip_outs), 27 * SUM(p_er) /SUM(p_ip_outs), IF(SUM(p_er), 1e20, NULL)) as p_earned_run_avg_csk, SUM(p_ip_outs IS NULL)+SUM(p_er IS NULL) as p_earned_run_avg_incomplete, ROUND(IF(SUM(p_ip_outs), 27 * SUM(p_er)/SUM(p_ip_outs), NULL),2) AS p_earned_run_avg, SUM(p_games_started IS NULL) as p_games_started_incomplete, SUM(p_games_started) AS p_games_started
FROM streak_list
  JOIN sup_player_games as st USING (person_id)
  JOIN sup_games USING (game_id)
  JOIN sup_people USING (person_id)
  JOIN sup_players USING (person_id)
  JOIN (SELECT game_id, year_id, comp_id, phase_id, team_id, opp_team_id, opp_comp_id, opp_phase_id, team_game_num_season, home_away_neutral, win, loss, tie FROM sup_team_games) as tg USING (game_id, team_id)
  JOIN (SELECT person_id, year_id, age as age_in_season FROM sup_player_team_seasons GROUP BY person_id, year_id ) as ps2 USING (person_id, year_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)
WHERE sup_phase_seasons.type=?
  AND is_pitcher=?
  AND CONCAT(`date`,IF(date_game_number,CONCAT(" (",date_game_number,")"),""))>=streak_start_date
  AND CONCAT(`date`,IF(date_game_number,CONCAT(" (",date_game_number,")"),""))<=streak_end_date 
GROUP BY person_id, streak_start_date, streak_end_date
ORDER BY streak_length DESC, streak_end_date_csk DESC, person_id 

SQL PARAMS -- $VAR1 = [
          'reg',
          2025,
          'reg',
          1,
          2025,
          2,
          'reg',
          1
        ];

Query Time: 1.10 seconds
Table Build Time: 0.05 seconds


--------------------------------------
SH->PARAM -- $VAR1 = {
          'year_max' => 2025,
          'player_game_max' => 9999,
          'comp_type' => 'reg',
          'order_by_asc' => '0',
          'max_wind_speed' => 90,
          'team_game_max' => 165,
          'team_game_min' => 1,
          'is_pitcher' => 1,
          'match' => 'player_streak_game',
          'streak_length' => 2,
          'player_game_min' => 1,
          'year_min' => 2025,
          'max_temperature' => 120,
          'days_rest_comp' => 'eq',
          'timeframe' => 'seasons',
          'order_by' => 'streak_length'
        };
SH->PARAM_NO_DEFAULT -- $VAR1 = {
          'year_min' => 2025,
          'order_by_asc' => '0',
          'is_pitcher' => 1,
          'order_by' => 'streak_length',
          'year_max' => 2025
        };

Search Criteria

Click on the red text to pre-fill the form with various values

Timeframe
Your search is currently looking for the individual games in the chosen span of days or seasons. You can also Switch to the search for totals from all games.
Your search is currently looking for the total of all games in the chosen span of days or seasons.
Game Type
Series/Game
Streak Options
Span of Games
Team Game No.

Overall team game in season, or playoff season if "playoffs" is selected above.

Min  
Max  
Player Game No. (in career)
Min  
Max  

Streak Stat Events (PA, H, HR, RBI, etc.)

Strikeouts

Player Filters (Team, League, Position, etc.)

Team
League

Note: Negro League game-level data is not yet available. See coverage note.

Age (as of day of game)

Days are optional. Leaving days blank will include entire year.

and
  days
to
and
  days
Throws
Pitcher's Role
Pitcher Decision
Days Rest
On the Player's Birthday
Place of Birth/Death

Game Filters (Opponent, Location, etc.)

Opponent
Opponent's League

Note: Negro League game-level data is not yet available. See coverage note.

Game Result
Game Location
Ballpark
Game Length
Interleague Games
DH Rule in Effect
Temperature
to
Wind Speed
to
Wind Direction
Precipitation
Sky
Day or Night

You have edited your search criteria

or keep editing your search

clear changes

Fetching Results

Stathead spinner

Query Results

Subscribe to Stathead Baseball for full results.

Go inside the Baseball Reference database and access the sports search engine that was made for fans like you. Subscriptions start at just $9/month. Learn More.

Get your first month FREE

Already a paid subscriber? Log in for full results.

Data coverage: Since 1871. Stats relying on play-by-play data are complete back to 1969, nearly complete back to 1950, and mostly complete back to 1912. Postseason data since 1903. Please see our data coverage page for details.

If you utilize material unique to a Sports Reference site for a tweet, an article, or for research for a broadcast or podcast, please strongly consider citing this site as the source for the material. It would be greatly appreciated and would help us continue to produce this material.