Back to WCA Statistics

Most frequent results

Frequency

Unroll every attempt value (each result has 1 ~ 5 attempts: 3x3 ao5 = 5, FMC mean = 3, single events = 1) across all WCA history, then count which exact centisecond values show up most often.

The result is oddly fun: round-number times pile up (e.g. 10.00 and 12.00 on 3x3), which is a side effect of how timer-stoppers eye the readout; FMC has dense integer values by construction; BLD is dominated by DNF, but > 0 filtering means the board shows only successes.

By the numbers

`> 0`
Successful only
DNF (-1), DNS (-2), unattempted (0) all skipped
21 项目
Per-event buckets
Different events have wildly different distributions; not pooled
top 10
Rows per event
Per event: the 10 most-frequent exact values
~M 级
Total attempts
Tens of millions of attempts across WCA history

Data source

SQL only SELECTs event_id and a comma-separated attempts string (built by ATTEMPTS_SUBQUERY over the result_attempts table, joining 1 ~ 5 attempts into one cell). Splitting, filtering, and counting all happen in TS. Excludes event_id = '333mbo' (legacy multi-BLD, superseded by 333mbf).

sql
SELECT
  event_id,
  ${ATTEMPTS_SUBQUERY} AS attempts  -- 1~5 attempts joined as 'v1,v2,v3,v4,v5'
FROM results result
WHERE event_id != '333mbo';

-- TS side:
--   for each row: attempts.split(',').map(Number)
--   for each value v > 0: counts.set(v, counts.get(v) + 1)
--   sort by count desc, top 10 per event

Algorithm / pipeline

1
Concatenate attempts
ATTEMPTS_SUBQUERY does a per-result_id GROUP_CONCAT(value ORDER BY attempt_number) over result_attempts, yielding strings like '1234,1100,1450,1380,1290'. (The WCA schema does not have value1..value5 columns — each attempt is its own row in result_attempts.)
2
Bucket by event + split attempts
EVENTS_ENTRIES.map builds one section per event. row.attempts.split(',').map(Number) extracts the 1 ~ 5 attempts; the v > 0 filter drops DNF (-1), DNS (-2), and unattempted (0).
3
`Map<number, number>` count
valueCounts.set(v, (valueCounts.get(v) ?? 0) + 1) — increment per occurrence. v is the raw centisecond / move-count integer, so 10.00 (1000), 10.01 (1001), 10.02 (1002) are three distinct keys.
4
Sort, top 10, format
[...valueCounts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10), then SolveTime(eventId, 'single', v).clockFormat() turns the integer into a display string (10.00, 33, etc.).

Caveats & edges

Related stats & links