Back to WCA Statistics

Shortest time to get all singles

Person

Cubers who got a valid single in every current official event, sorted by time-to-completion. Subquery filters retired events via events.rank < 900, then COUNT(DISTINCT event_id) = (SELECT COUNT(*) FROM events WHERE rank<900) locks candidates.

Top spots usually finish within a year; the absolute fastest take months, but you need comps that hold rare events (7x7 / FMC / Multi-Blind) — sparse regions just can't close the set.

By the numbers

rank < 900
Official filter
Retired events at rank ≥ 900
best > 0
Valid single
DNF doesn't count
首场 → 最后项目
Time span
Not just 3x3 debut

Data source

Subquery isolates "all-singles" cubers → outer join pulls all their results, finds the earliest best > 0 per (person, event). Last event's completion date minus first comp date = days.

Historical note: using Object.keys(EVENTS).length = 21 (with retired) would never satisfy the HAVING — switched to (SELECT COUNT(*) FROM events WHERE rank<900) subquery to match the SQL filter.

sql
SELECT event_id, person_link, start_date, best
FROM (SELECT person_id FROM results
      JOIN events ON events.id = event_id
      WHERE rank < 900 AND best > 0
      GROUP BY person_id
      HAVING COUNT(DISTINCT event_id) =
             (SELECT COUNT(*) FROM events WHERE rank<900)) all_events
JOIN results r ON r.person_id = all_events.person_id
JOIN persons person ON wca_id = r.person_id AND sub_id = 1
JOIN competitions ON id = competition_id
ORDER BY start_date

Algorithm / pipeline

1
Lock "all-singles" candidates
Subquery HAVING COUNT(DISTINCT event_id) = (SELECT COUNT(*) FROM events WHERE rank<900) — at least one best > 0 in every current event.
2
Pull full results timeline
Outer pulls every result for candidates; TS groups by person, first row = first comp (start_date ascending guarantees).
3
Earliest success per event
Map<eventId, Date>: iterate personRows, keep earliest best > 0 date per event. Last-completed event = max value in the Map.
4
Day-diff ascending
days = floor((lastEventDate − firstDate) / 24h); sort asc, no LIMIT (UI paginates).

Caveats & edges

Related stats & links