Back to feed

Project docs

Ski Jumping Statistics

PostgreSQL analysis of men's Ski Jumping World Cup results, supported by a Python data collection pipeline.

Result Streaks

The longest sequences of consecutive competition results within a selected range of finishing positions.

Rules

  • A streak continues while an athlete finishes within the selected inclusive position range.
  • A result outside that range ends the athlete’s current streak.
  • Streaks continue across season boundaries rather than resetting for each season.
  • The same calculation supports wins, podiums, top 10 finishes, top 30 finishes, and other position ranges.

The find_in_row() function processes final positions from competition_results in chronological order. Its lower and upper position arguments define which results continue a streak—for example, 1–1 for wins or 1–3 for podiums.

Finding consecutive results

create or replace function find_in_row(lb_pos int, ub_pos int)
returns table(
	jumper_id int,
	date_from date,
	date_to date,
	n int
)
language plpgsql
as $$
declare
	curr_competition record;
begin
	create temporary table tmp_results(
		jumper_id int,
		date_from date,
		date_to date,
		n int
	) on commit drop;

	create temporary table tmp_counters(
		jumper_id int,
		date_from date,
		date_to date,
		n int,
		constraint uq_tmp_counters_jumper unique (jumper_id)
	) on commit drop;

	for curr_competition in (
		select c.race_id, c.competition_started
		from competitions c
		order by c.competition_started
	)
	loop
		insert into tmp_counters as tc
			select 
				cr.jumper_id, 
				curr_competition.competition_started::date, 
				curr_competition.competition_started::date,
				1
			from competition_results cr
			where cr.race_id = curr_competition.race_id 
				and cr.pos >= lb_pos 
				and cr.pos <= ub_pos
		on conflict on constraint uq_tmp_counters_jumper
		do update set 
			date_to = curr_competition.competition_started::date, 
			n = tc.n + 1;

		with outdated as (
			delete from tmp_counters tc
			where tc.date_to != curr_competition.competition_started::date
			returning tc.jumper_id, tc.date_from, tc.date_to, tc.n
		)
		insert into tmp_results
		select * from outdated;
	end loop;

	return query
		select * from tmp_results;
end $$;

Consecutive wins

select
	j.jumper_name,
	n as wins_in_a_row,
	date_from,
	date_to
from find_in_row(1, 1)
join jumpers j using (jumper_id)
order by n desc;

Results

All consecutive wins since 2017/18 season186 rows
jumper_namewins_in_a_rowdate_fromdate_to
KOBAYASHI Ryoyu62018-12-162019-01-12
PREVC Domen62026-01-172026-03-01
PREVC Domen52025-12-062025-12-20
GRANERUD Halvor Egner52020-11-292020-12-20
STOCH Kamil42017-12-302018-01-06
GRANERUD Halvor Egner42023-01-282023-02-05
KOBAYASHI Ryoyu42021-12-192022-01-05
KRAFT Stefan42023-11-252023-12-03
GRANERUD Halvor Egner42021-01-302021-02-07
KRAFT Stefan32019-01-202019-01-27
PASCHKE Pius32024-12-082024-12-15
KOBAYASHI Ryoyu32025-02-152025-03-13
STOCH Kamil32021-01-032021-01-09
GEIGER Karl32021-03-262021-11-20
GRANERUD Halvor Egner22022-12-292023-01-01
KOBAYASHI Ryoyu22018-11-242018-11-25
TSCHOFENIG Daniel22025-01-062025-01-19
GRANERUD Halvor Egner22023-01-062023-01-15
LINDVIK Marius22022-01-082022-01-16
KRAFT Stefan22024-02-112024-02-17
GEIGER Karl22022-01-222022-01-23
GEIGER Karl22020-01-112020-01-12
LINDVIK Marius22020-01-012020-01-04
KUBACKI Dawid22020-01-182020-01-19
LANISEK Anze22025-11-262025-11-29
KOBAYASHI Ryoyu22019-12-222019-12-29
KOBAYASHI Ryoyu22021-02-192021-03-25
PREVC Domen22025-12-292026-01-01
STOCH Kamil22019-02-032019-02-10
STOCH Kamil22018-03-132018-03-15
TANDE Daniel Andre22019-11-242019-11-30
KRAFT Stefan22020-02-222020-02-28
KRAFT Stefan22024-03-132024-03-17
GEIGER Karl22023-12-092023-12-10
KUBACKI Dawid22022-11-052022-11-06
EISENBICHLER Markus22020-11-222020-11-28
TSCHOFENIG Daniel22025-02-012025-02-02
STOCH Kamil22018-03-232018-03-25
ZYLA Piotr12020-02-152020-02-15
KRAFT Stefan12020-02-162020-02-16
GEIGER Karl12020-02-212020-02-21
GEIGER Karl12020-03-012020-03-01
PREVC Peter12020-03-092020-03-09
STOCH Kamil12020-03-102020-03-10
GEIGER Karl12020-12-292020-12-29
KUBACKI Dawid12021-01-012021-01-01
GRANERUD Halvor Egner12021-01-102021-01-10
LINDVIK Marius12021-01-172021-01-17
JOHANSSON Robert12021-01-242021-01-24
KOBAYASHI Ryoyu12021-02-132021-02-13
GRANERUD Halvor Egner12021-02-142021-02-14
GRANERUD Halvor Egner12021-11-212021-11-21
KOBAYASHI Ryoyu12021-11-272021-11-27
LANISEK Anze12021-11-282021-11-28
HOERL Jan12021-12-052021-12-05
KRAFT Stefan12021-12-112021-12-11
KOBAYASHI Ryoyu12021-12-122021-12-12
GEIGER Karl12021-12-182021-12-18
HUBER Daniel12022-01-062022-01-06
KOBAYASHI Ryoyu12022-01-292022-01-29
LINDVIK Marius12022-01-302022-01-30
KRAFT Stefan12022-02-252022-02-25
GRANERUD Halvor Egner12022-02-272022-02-27
KOBAYASHI Ryoyu12022-02-272022-02-27
KRAFT Stefan12022-03-032022-03-03
LINDVIK Marius12022-03-052022-03-05
TANDE Daniel Andre12022-03-062022-03-06
KRAFT Stefan12022-03-192022-03-19
ZAJC Timi12022-03-202022-03-20
JELAR Ziga12022-03-252022-03-25
LINDVIK Marius12022-03-272022-03-27
LANISEK Anze12022-11-262022-11-26
GRANERUD Halvor Egner12022-11-272022-11-27
KRAFT Stefan12022-11-272022-11-27
LANISEK Anze12022-12-092022-12-09
KUBACKI Dawid12022-12-112022-12-11
LANISEK Anze12022-12-172022-12-17
KUBACKI Dawid12022-12-182022-12-18
KUBACKI Dawid12023-01-042023-01-04
KOBAYASHI Ryoyu12023-01-202023-01-20
KRAFT Stefan12023-01-212023-01-21
KOBAYASHI Ryoyu12023-01-222023-01-22
WELLINGER Andreas12023-02-112023-02-11
GRANERUD Halvor Egner12023-02-122023-02-12
WELLINGER Andreas12023-02-182023-02-18
LANISEK Anze12023-03-112023-03-11
KRAFT Stefan12023-03-122023-03-12
GRANERUD Halvor Egner12023-03-142023-03-14
KUBACKI Dawid12023-03-162023-03-16
GRANERUD Halvor Egner12023-03-182023-03-18
KRAFT Stefan12023-03-192023-03-19
KOBAYASHI Ryoyu12023-03-262023-03-26
KRAFT Stefan12023-04-012023-04-01
ZAJC Timi12023-04-022023-04-02
PASCHKE Pius12023-12-162023-12-16
KRAFT Stefan12023-12-172023-12-17
WELLINGER Andreas12023-12-292023-12-29
LANISEK Anze12024-01-012024-01-01
HOERL Jan12024-01-032024-01-03
KRAFT Stefan12024-01-062024-01-06
KOBAYASHI Ryoyu12024-01-142024-01-14
KRAFT Stefan12024-01-212024-01-21
FORFANG Johann Andre12024-02-032024-02-03
WELLINGER Andreas12024-02-042024-02-04
KOS Lovro12024-02-102024-02-10
PREVC Domen12024-02-182024-02-18
ZAJC Timi12024-02-242024-02-24
KRAFT Stefan12024-02-252024-02-25
KOS Lovro12024-03-012024-03-01
HOERL Jan12024-03-032024-03-03
KRAFT Stefan12024-03-092024-03-09
FORFANG Johann Andre12024-03-102024-03-10
KOBAYASHI Ryoyu12024-03-122024-03-12
HUBER Daniel12024-03-172024-03-17
PREVC Peter12024-03-222024-03-22
HUBER Daniel12024-03-242024-03-24
PASCHKE Pius12024-11-232024-11-23
HOERL Jan12024-11-242024-11-24
PASCHKE Pius12024-11-302024-11-30
WELLINGER Andreas12024-12-012024-12-01
TSCHOFENIG Daniel12024-12-072024-12-07
HOERL Jan12024-12-212024-12-21
TSCHOFENIG Daniel12024-12-222024-12-22
KRAFT Stefan12024-12-292024-12-29
TSCHOFENIG Daniel12025-01-012025-01-01
KRAFT Stefan12025-01-042025-01-04
ZAJC Timi12025-01-252025-01-25
PREVC Domen12025-01-262025-01-26
FORFANG Johann Andre12025-02-082025-02-08
TSCHOFENIG Daniel12025-02-092025-02-09
WELLINGER Andreas12025-03-152025-03-15
PREVC Domen12025-03-162025-03-16
LANISEK Anze12025-03-222025-03-22
PREVC Domen12025-03-282025-03-28
LANISEK Anze12025-03-302025-03-30
TSCHOFENIG Daniel12025-11-222025-11-22
KOBAYASHI Ryoyu12025-11-232025-11-23
KRAFT Stefan12025-11-252025-11-25
KOBAYASHI Ryoyu12025-12-212025-12-21
NIKAIDO Ren12026-01-042026-01-04
TSCHOFENIG Daniel12026-01-062026-01-06
LANISEK Anze12026-01-112026-01-11
RAIMUND Philipp12026-03-062026-03-06
TSCHOFENIG Daniel12026-03-072026-03-07
DESCHWANDEN Gregor12026-03-142026-03-14
NAITO Tomofumi12026-03-152026-03-15
EMBACHER Stephan12026-03-212026-03-21
KOBAYASHI Junshiro12017-11-192017-11-19
PREVC Domen12026-03-272026-03-27
DAMJAN Jernej12017-11-262017-11-26
FREITAG Richard12017-12-022017-12-02
WELLINGER Andreas12017-12-032017-12-03
FREITAG Richard12017-12-102017-12-10
FANNEMEL Anders12017-12-162017-12-16
FREITAG Richard12017-12-172017-12-17
STJERNEN Andreas12018-01-132018-01-13
SEMENIC Anze12018-01-282018-01-28
TANDE Daniel Andre12018-02-032018-02-03
FORFANG Johann Andre12018-02-042018-02-04
STOCH Kamil12018-03-042018-03-04
TANDE Daniel Andre12018-03-112018-03-11
JOHANSSON Robert12018-03-182018-03-18
KLIMOV Evgeniy12018-11-182018-11-18
FORFANG Johann Andre12018-12-012018-12-01
KOBAYASHI Ryoyu12018-12-022018-12-02
GEIGER Karl12018-12-152018-12-15
KUBACKI Dawid12019-01-132019-01-13
ZAJC Timi12019-02-012019-02-01
KOBAYASHI Ryoyu12019-02-022019-02-02
GEIGER Karl12019-02-162019-02-16
KOBAYASHI Ryoyu12019-02-172019-02-17
JOHANSSON Robert12019-03-102019-03-10
KRAFT Stefan12019-03-122019-03-12
KOBAYASHI Ryoyu12019-03-142019-03-14
PREVC Domen12019-03-172019-03-17
EISENBICHLER Markus12019-03-222019-03-22
KOBAYASHI Ryoyu12019-03-242019-03-24
SATO Yukiya12019-12-072019-12-07
KRAFT Stefan12019-12-082019-12-08
KOBAYASHI Ryoyu12019-12-152019-12-15
STOCH Kamil12019-12-212019-12-21
KUBACKI Dawid12020-01-062020-01-06
STOCH Kamil12020-01-262020-01-26
SATO Yukiya12020-02-012020-02-01
KRAFT Stefan12020-02-022020-02-02
LEYHE Stephan12020-02-082020-02-08

Consecutive podiums

select
	j.jumper_name,
	n as podiums_in_a_row,
	date_from,
	date_to
from find_in_row(1, 3)
join jumpers j using (jumper_id)
order by n desc
limit 100;

Results

100 longest consecutive podiums streaks100 rows
jumper_namepodiums_in_a_rowdate_fromdate_to
GRANERUD Halvor Egner122022-12-292023-02-05
PREVC Domen122025-11-262026-01-06
KRAFT Stefan102023-03-182023-12-09
KUBACKI Dawid102022-12-092023-01-20
KUBACKI Dawid102019-12-292020-02-01
TSCHOFENIG Daniel72024-12-212025-01-19
FREITAG Richard72017-12-022018-01-01
KOBAYASHI Ryoyu62018-12-162019-01-12
KOBAYASHI Ryoyu62021-12-122022-01-05
PREVC Domen62026-01-172026-03-01
GEIGER Karl62021-02-192021-11-21
KRAFT Stefan62020-02-152020-03-01
STOCH Kamil62017-12-162018-01-06
KOBAYASHI Ryoyu52021-02-192021-11-20
KOBAYASHI Ryoyu52023-12-292024-01-14
KOBAYASHI Ryoyu52019-03-122019-03-24
KOBAYASHI Ryoyu52018-11-182018-12-02
GRANERUD Halvor Egner52020-11-292020-12-20
KRAFT Stefan42019-01-132019-01-27
ZYLA Piotr42018-12-012018-12-16
HOERL Jan42025-02-022025-02-15
GEIGER Karl42020-02-212020-03-01
LANISEK Anze42022-12-092022-12-18
KRAFT Stefan42019-03-102019-03-17
TSCHOFENIG Daniel42025-02-012025-02-09
PASCHKE Pius42024-12-072024-12-15
HUBER Daniel42024-03-172024-03-24
GRANERUD Halvor Egner42021-01-302021-02-07
STOCH Kamil32021-01-032021-01-09
LINDVIK Marius32020-01-012020-01-06
KRAFT Stefan32024-01-062024-01-21
KRAFT Stefan32023-03-112023-03-14
WELLINGER Andreas32023-11-262023-12-03
WELLINGER Andreas32023-02-112023-02-18
LANISEK Anze32023-01-012023-01-06
KRAFT Stefan32023-12-162023-12-29
STOCH Kamil32019-02-032019-02-16
GRANERUD Halvor Egner32022-01-052022-01-08
GEIGER Karl32022-01-162022-01-23
KOBAYASHI Ryoyu32023-01-202023-01-22
KRAFT Stefan32022-02-252022-03-03
HOFFMANN Felix32025-12-202025-12-29
LANISEK Anze32025-11-252025-11-29
KOBAYASHI Ryoyu32019-02-102019-02-17
RAIMUND Philipp32025-12-062025-12-13
LANISEK Anze32022-01-162022-01-23
JOHANSSON Robert32018-03-132018-03-18
EISENBICHLER Markus32020-11-222020-11-29
FORFANG Johann Andre32025-01-192025-01-26
HOERL Jan32024-12-212024-12-29
PASCHKE Pius32024-11-232024-11-30
HOERL Jan32025-01-042025-01-19
KOBAYASHI Ryoyu32025-02-152025-03-13
KOBAYASHI Ryoyu32024-02-032024-02-10
KRAFT Stefan32020-01-112020-01-18
KRAFT Stefan32024-03-132024-03-17
KRAFT Stefan32022-03-062022-03-20
KRAFT Stefan32019-12-082019-12-21
GEIGER Karl32020-01-062020-01-12
KRAFT Stefan32020-01-262020-02-02
LANISEK Anze32025-03-222025-03-30
KUBACKI Dawid32019-01-062019-01-13
STOCH Kamil22018-02-042018-03-04
KRAFT Stefan22019-01-042019-01-06
FORFANG Johann Andre22017-11-262017-12-02
GEIGER Karl22023-12-092023-12-10
GRANERUD Halvor Egner22023-03-182023-03-19
EISENBICHLER Markus22018-12-302019-01-01
LANISEK Anze22023-04-012023-04-02
TSCHOFENIG Daniel22023-03-162023-03-18
PASCHKE Pius22023-12-162023-12-17
KOBAYASHI Ryoyu22023-02-052023-02-11
KRAFT Stefan22023-01-282023-01-29
FORFANG Johann Andre22018-12-012018-12-02
GEIGER Karl22023-02-182023-03-11
STOCH Kamil22018-11-242018-11-25
KRAFT Stefan22022-11-262022-11-27
ASCHENWALD Philipp22019-11-302019-12-07
PREVC Peter22022-03-252022-03-27
KUBACKI Dawid22022-11-052022-11-06
LANISEK Anze22023-03-112023-03-12
GRANERUD Halvor Egner22022-02-252022-02-27
TANDE Daniel Andre22019-11-242019-11-30
EISENBICHLER Markus22022-01-222022-01-23
LINDVIK Marius22022-01-082022-01-16
KRAFT Stefan22018-03-232018-03-25
KOBAYASHI Ryoyu22022-02-272022-03-03
STOCH Kamil22018-03-232018-03-25
EISENBICHLER Markus22021-11-272021-11-28
EISENBICHLER Markus22019-03-222019-03-24
JOHANSSON Robert22019-03-102019-03-12
LANISEK Anze22021-11-272021-11-28
LANISEK Anze22019-11-242019-11-30
LINDVIK Marius22022-01-292022-01-30
KRAFT Stefan22021-12-052021-12-11
PAVLOVCIC Bor22021-02-062021-02-07
LANISEK Anze22022-11-062022-11-26
KOBAYASHI Ryoyu22019-12-082019-12-15
GRANERUD Halvor Egner22021-01-092021-01-10
JOHANSSON Robert22021-01-172021-01-24

Consecutive top 30 finishes

select
	j.jumper_name,
	n as top30_in_a_row,
	date_from,
	date_to
from find_in_row(1, 30)
join jumpers j using (jumper_id)
order by n desc
limit 100

Results

100 longest top 30 finishes streaks100 rows
jumper_nametop30_in_a_rowdate_fromdate_to
WELLINGER Andreas632023-04-012025-03-30
KOBAYASHI Ryoyu562018-03-042020-02-16
JOHANSSON Robert512017-11-192019-11-24
KRAFT Stefan462019-01-042020-03-10
TSCHOFENIG Daniel462024-03-102025-12-20
DESCHWANDEN Gregor442024-03-012025-11-29
STOCH Kamil442019-01-262020-11-29
KRAFT Stefan422024-03-032025-11-26
GEIGER Karl422019-02-012020-11-29
LINDVIK Marius382023-12-022024-12-15
LEYHE Stephan362017-12-032019-02-01
KRAFT Stefan352022-01-222023-02-12
GEIGER Karl342021-02-132022-03-27
KOBAYASHI Ryoyu332023-03-112024-03-03
PREVC Domen332025-02-022026-03-01
HOERL Jan332024-11-232025-11-26
KUBACKI Dawid322018-11-252019-12-21
NIKAIDO Ren312025-01-062026-01-06
FORFANG Johann Andre302017-12-172019-01-20
HAYBOECK Michael272023-03-112024-02-11
KUBACKI Dawid262022-03-192023-02-12
PASCHKE Pius262024-02-242025-01-06
FETTNER Manuel262022-02-272023-01-29
PREVC Peter252019-03-102020-02-08
NIKAIDO Ren252023-12-032024-03-13
LEYHE Stephan252019-12-072020-03-10
HOERL Jan252023-03-112024-02-04
KOS Lovro252023-12-172024-03-24
KOBAYASHI Ryoyu252021-12-112022-11-06
KOUDELKA Roman252018-11-182019-03-14
KOBAYASHI Ryoyu242020-11-292021-11-20
GRANERUD Halvor Egner242022-03-252023-02-12
KOBAYASHI Ryoyu242025-02-092026-01-06
SUNDAL Kristoffer Eriksen232024-11-232025-02-16
FORFANG Johann Andre232024-01-142024-11-30
LANISEK Anze232023-03-112024-01-21
KRAFT Stefan232023-03-112024-01-21
LANISEK Anze222025-03-132026-01-11
STOCH Kamil222018-02-032019-01-13
GRANERUD Halvor Egner222020-11-222021-02-19
HUBER Daniel222021-03-252022-01-30
LANISEK Anze212022-03-032023-01-20
ZYLA Piotr212022-02-252023-01-06
KOBAYASHI Ryoyu212024-03-102025-01-06
HAYBOECK Michael212019-12-292020-11-22
EISENBICHLER Markus202021-01-092021-12-11
WELLINGER Andreas202022-12-112023-03-12
JOHANSSON Robert202021-01-012021-11-27
ZYLA Piotr202017-11-192018-03-18
GRANERUD Halvor Egner192021-12-112022-03-06
WELLINGER Andreas192017-11-192018-03-15
GEIGER Karl192023-03-182024-01-21
FORFANG Johann Andre182024-12-082025-02-16
PASCHKE Pius182021-01-062021-11-27
EISENBICHLER Markus172021-12-292022-03-20
LANISEK Anze172024-03-242025-01-25
PREVC Domen172019-12-152020-02-16
KUBACKI Dawid172020-12-192021-02-19
HOERL Jan172021-11-202022-01-23
FETTNER Manuel172025-02-152025-12-14
STOCH Kamil172020-12-192021-02-19
ZAJC Timi162023-03-112023-12-16
ORTNER Maximilian162024-11-232025-01-25
TSCHOFENIG Daniel152023-03-112023-12-10
HOFFMANN Felix152025-11-222026-01-06
HAYBOECK Michael152024-02-242024-11-30
KRAFT Stefan152018-03-042018-12-30
PEIER Killian152021-11-202022-01-16
GEIGER Karl152018-03-252019-01-20
ZNISZCZOL Aleksander152024-01-012024-03-03
ZAJC Timi152022-01-302022-12-09
STEKALA Andrzej152020-12-192021-02-13
WASEK Pawel142025-01-262025-11-22
FORFANG Johann Andre142025-12-062026-01-31
PREVC Peter142024-02-172024-03-24
GEIGER Karl142024-03-222025-01-01
FORFANG Johann Andre142019-01-272019-11-24
ASCHENWALD Philipp142020-12-292021-02-14
FORFANG Johann Andre142019-12-072020-01-26
LANISEK Anze142021-03-252022-01-01
SCHUSTER Jonas132025-12-062026-01-18
HAYBOECK Michael132024-12-072025-01-26
ZYLA Piotr132019-01-062019-03-10
ASCHENWALD Philipp132019-03-222020-01-06
KUBACKI Dawid132019-12-292020-02-15
LINDVIK Marius132025-11-222026-01-01
FREITAG Richard132018-01-282018-11-25
LINDVIK Marius122020-01-122020-02-28
FORFANG Johann Andre122022-12-292023-02-05
KOBAYASHI Junshiro122018-03-132018-12-16
LINDVIK Marius122021-11-282022-01-16
STOCH Kamil122017-11-192018-01-13
EISENBICHLER Markus122017-11-192018-01-13
TANDE Daniel Andre122017-11-192018-01-13
FETTNER Manuel122024-02-102024-03-13
HUBER Daniel122020-12-192021-01-31
ZOGRAFSKI Vladimir122025-03-222025-12-14
HULA Stefan122017-12-102018-03-04
JOHANSSON Robert122022-11-052023-01-06
SUNDAL Kristoffer Eriksen122026-01-112026-03-21