Back to WCA Statistics

Consecutive sub-5 averages

3x3x3

For 3x3x3 only: take a cuber's sequence of official-round averages in chronological order — what's the longest consecutive run where every single one is < 5.00 seconds? That's the metric. A streak breaks on any ≥ 5.00 average (or DNF).

Unlike Ao1000's "long-horizon mean", this is every-round-must-clear — one slip resets to zero. More of a sustained-pressure metric than a smoothing one. Two views: Ranking (each person's longest, top 100) + History (newest-first WR evolution).

By the numbers

500
Threshold (cs)
5.00s = 500 centiseconds
333 only
Scope
event_id = 333 only
count > 1
Min streak
Need ≥ 2 to count
top 100
Ranking shown
Per person's longest, top 100

Data source

Pull every 333 row, join persons + competitions + round_types; sort (person_id, start_date, round_type.rank) ascending to enforce per-person chronology and per-day round order.

Group in memory by person_id, scan per person maintaining a "current streak" object. average strictly < 500 and > 0 → bump count, update end-comp; otherwise commit if count > 1 and reset.

sql
SELECT result.person_id, person_link, result.average,
       competition.cell_name AS competition_name,
       competition.id AS competition_id,
       competition.start_date
FROM results result
JOIN persons person ON person.wca_id = result.person_id AND person.sub_id = 1
JOIN competitions competition ON competition.id = result.competition_id
JOIN round_types round_type ON round_type.id = result.round_type_id
WHERE result.event_id = '333'
ORDER BY result.person_id, competition.start_date, round_type.rank;

Algorithm / pipeline

1
Pull all 333 averages, sort by (person, time)
ORDER BY person_id, start_date, round_type.rank enforces strict per-person chronology; downstream scan needs no re-sorting.
2
Split by person_id, scan each
byPerson: Map<pid, rows> partitions in memory; release raw rows (paired with global.gc()) and process each cuber independently.
3
avg < 500 → extend; else commit
For each row: avg > 0 && avg < 500 → count += 1, update endComp/endDate (and set startComp on count == 1); else if count > 1, commit the streak and reset. After the loop, commit the trailing run too.
4
Ranking: each person's longest, top 100
bestByPerson collapses one cuber's many streaks to their longest; sort descending by count, take top 100. Row = [count, person_link, startComp_link, endComp_link].
5
History: WR evolution reversed
Sort all streaks ascending by (endDate, count); scan tracking maxCount, keep entries with count >= maxCount && count > 1 (note >= — ties allowed here); reverse for newest-first.

Key formulae

Streak definition
streak(P) = max { k : ∃ i, aᵢ, aᵢ₊₁, ..., aᵢ₊ₖ₋₁ all < 5.00 }
(aⱼ) = P's 333 averages in chronological order; the longest run of consecutive entries all < 5.00 = streak length.

Caveats & edges

Related stats & links