Competitions per year by person
PersonFlattens each cuber's WCA career length and computes the average competitions per year. Six years with 90 comps = 15 / year.
Absolute counts favour decade-long travellers; this metric separates "short burst" from "sustained high frequency" — you need both volume and longevity to chart.
By the numbers
≥ 1 yr
Eligibility
At least 1 year since first comp
Top 100
Leaderboard depth
Sorted by comps/year desc
CURDATE()
Career end
Dump's today, not last comp date
Data source
results with DISTINCT competition_id (one comp counts once regardless of events). Earliest competitions.start_date per person. Years = (CURDATE() - MIN(start_date)) / 365.25.
sql
SELECT COUNT(DISTINCT competition_id) competitions, (DATEDIFF(CURDATE(), MIN(start_date)) / 365.25) years, person_id FROM results JOIN competitions ON competitions.id = competition_id GROUP BY person_id HAVING years >= 1 ORDER BY competitions / years DESC LIMIT 100
Algorithm / pipeline
1
Aggregate per person
Each
results row is one event-round; COUNT(DISTINCT competition_id) collapses multi-event same-comp entries to 1.2
Measure career span
MIN(start_date) = first comp → difference with CURDATE() divided by 365.25 (leap-year averaged).3
Filter newcomers
HAVING years >= 1 removes "8 comps in first 3 months" outliers — small denominator would inflate the rate.4
Sort, take top 100
Order by
competitions / years desc, LIMIT 100. Two decimals retained to break ties.Key formulae
Formula
rate(p) = comps(p) / ((today − firstCompDate(p)) / 365.25)
comps is distinct count, firstCompDate is earliest start_date for the person.Caveats & edges
- Denominator uses today, not last-comp-date — a 2008 retiree from 2012 is still divided by 18 years, diluting the rate.
- Two cross-region comps in one weekend count separately — different
competition_id= different comp. - Alt identities (rename / country change,
sub_id > 1) excluded — only the primarypersonsrow.