Back to WCA Statistics

DNF rate by event

Event

For each event, DNF count ÷ actual attempts. Attempts excludes two flavors of non-solve: value = 0 (placeholder for not-submitted) and value = -2 (DNS — no-show).

BLD / FMC / MBLD sit well above 3x3: blindfolded depends on full memorization, FMC has a 1-hour cap with move limits, MBLD DNFs the whole attempt if any cube fails.

By the numbers

value=-1
DNF encoding
In result_attempts.value
value=-2
DNS encoding
Excluded from denominator
value=0
Empty slot
5-attempts round not filled
%
Display
2-decimal percentage

Data source

JOIN results to result_attempts (one row = one solve attempt — the fine-grained WCA dump table). Group by event_id, SUM the DNFs (value = -1) and attempts (value NOT IN (-2, 0)); TS side then computes the ratio and sorts DESC.

sql
SELECT
  r.event_id,
  SUM(CASE WHEN ra.value = -1 THEN 1 ELSE 0 END) dnfs,
  SUM(CASE WHEN ra.value NOT IN (-2, 0) THEN 1 ELSE 0 END) attempts
FROM results r
JOIN result_attempts ra ON ra.result_id = r.id
GROUP BY r.event_id;

Algorithm / pipeline

1
Expand to per-attempt rows
results is one row per round (with best/average); the individual 5 attempts live in result_attempts. JOIN multiplies row count by ~5.
2
Recognize three value types
value > 0 real result (centisecond / move / FMC encoding); = -1 DNF; = -2 DNS (no-show); = 0 empty slot when a 5-attempt round wasn't fully filled.
3
SUM out two numbers
SUM(CASE WHEN value = -1 THEN 1 ELSE 0 END) = DNF count; SUM(CASE WHEN value NOT IN (-2, 0) THEN 1 ELSE 0 END) = real attempts (including DNFs).
4
Group by event
GROUP BY r.event_id — one row per WCA event.
5
Compute and sort in TS
TS computes 100 * dnfs / attempts, formats as toFixed(2) + " %", sorts DESC by rate, and maps event_id through EVENTS[id] for display.

Key formulae

DNF rate
dnf_rate = dnf_count / attempted
dnf_count = COUNT(value = -1); attempted = COUNT(value ≠ -2 and ≠ 0) — excludes DNS and empty slots. Multiplied by 100 with % for display.

Caveats & edges

Related stats & links