Kinderkopje data: tables and fields

What is in the Kinderkopje database (SQLite), v0.1.0 (db55b20). Open the Data page of the tool to ask it questions in SQL (read only). The two views, v_team_points and v_results, are the easy way in.

Rankings, calendars and results come from the Union Cycliste Internationale (UCI): uci.org and DataRide. Team levels come from Wikipedia (CC BY-SA 4.0).

team_snapshot

One row per captured UCI World Ranking (team ranking) date.

FieldMeaning
idRow number, used by team_rank.
seasonThe season the ranking belongs to. UCI points start again at zero on 1 January.
dateThe ranking date shown on DataRide, as yyyy-mm-dd. Unique.
moment_idUCI's own number for this ranking snapshot.
complete1 if every team of the ranking was captured, 0 if only some pages were (the usual case: top 40).

Links: team_rank.snapshot_id = team_snapshot.id

Example, which ranking dates have been captured?:

SELECT season, date, complete, (SELECT COUNT(*) FROM team_rank r WHERE r.snapshot_id = s.id) AS teams FROM team_snapshot s ORDER BY date

team_rank

The teams of each captured ranking: position and points on that date.

FieldMeaning
snapshot_idWhich ranking date: team_snapshot.id.
team_idUCI's team number. It stays with the team's licence when the name or code changes (UAE: UAD in 2025, UEX in 2026), so use it to follow a team over the years.
codeThe team's UCI code in that season, for example UAD.
nameThe team's name in that season.
nationThe team's nation (UCI's three-letter code).
rankPosition in the ranking on that date.
pointsUCI World Ranking points, season to date.

Links: snapshot_id -> team_snapshot.id; team_id also appears in team_level

Example, the top 10 of the newest captured ranking:

SELECT rank, code, name, points FROM v_team_points WHERE date = (SELECT MAX(date) FROM team_snapshot) ORDER BY rank LIMIT 10

team_level

Which teams were WorldTeams or ProTeams in a season (from Wikipedia). Teams that are not listed are lower-level, mostly Continental.

FieldMeaning
seasonThe season.
team_idUCI's team number, as in team_rank.
levelWT = WorldTeam, PT = ProTeam.

Links: team_id = team_rank.team_id

Example, worldteams and proteams per season:

SELECT season, level, COUNT(*) AS teams FROM team_level GROUP BY season, level ORDER BY season DESC, level

race_result

One row per captured race edition (a race in one year). Each edition has its own number on DataRide, UCI's results site.

FieldMeaning
uci_idDataRide's competition number for this edition (the number in dataride.uci.ch/iframe/CompetitionResults/<number>). Each year of a race has its own.
yearThe year of the edition.
nameThe race name as DataRide writes it.
classThe UCI class, for example 2.UWT, 1.Pro, 1.1.
class_textThe full class text from the page, for example '1.Pro - 1 day - UCI ProSeries'.
datesThe dates as UCI writes them, for example '11 Oct 2026'.
countryThe country (UCI's three-letter code).
captured_atWhen it was captured (date and time).
contributorWho captured it. Not used by the current capture; always empty in a public copy.
race_idWhich race this edition belongs to: race.race_id. The same race has the same id in every year, whatever it was called.

Links: classification.uci_id = race_result.uci_id

Example, races captured so far, and by whom:

SELECT year, name, class, dates, contributor FROM race_result ORDER BY year, name

classification

A result list of a race: the General Classification or one stage (one DataRide event).

FieldMeaning
idRow number, used by result_row.
uci_idWhich race edition: race_result.uci_id.
labelThe name of the event, for example 'General Classification' or 'Stage 3'.
titleThe page's heading, for example 'Giro del Veneto Individual Road Race'.
total_rowsHow many rows the table had. Only the rows that score points are kept in result_row.
event_idDataRide's number for this event (the number in .../EventResults/<number>).

Links: uci_id -> race_result.uci_id; result_row.classification_id = classification.id

Example, how many rows scored points, out of how many:

SELECT r.name, r.year, c.label, c.total_rows, (SELECT COUNT(*) FROM result_row w WHERE w.classification_id = c.id) AS scoring_rows FROM classification c JOIN race_result r ON r.uci_id = c.uci_id ORDER BY r.year, r.name

result_row

One row per rider who scored UCI points in a result list.

FieldMeaning
classification_idWhich result list: classification.id.
rankThe place in that list. Empty when the page showed none.
riderFirst name and SURNAME as UCI writes them.
teamThe team name as written on the race page. This is a name, not a team number.
ageThe rider's age at the time of the race, as DataRide shows it (19 to 50 in the captured data, present on every row). Part of the public file.
nationThe rider's nation (three-letter code).
resultThe time or gap as shown, for example 4:31:46 or +02.
pointsUCI points this result gave.

Links: classification_id -> classification.id. The view v_results joins all three tables.

Example, the riders who scored most in the captured races:

SELECT rider, team, SUM(points) AS points, COUNT(*) AS results FROM v_results GROUP BY rider, team ORDER BY points DESC LIMIT 20

race

One row per race (men's or women's elite), the same race in every year whatever it was called. Races that changed their name are joined into one.

FieldMeaning
race_idThe race's number.
keyWhat the number follows when races are joined: a short form of the core name, with the category.
nameThe internal name: what this project calls the race. By default the shortest name UCI has used, without sponsors; it can be renamed.
slugThe internal name as a short, web-safe text, for example classic-brugge-de-panne.
categoryME = men's elite, WE = women's elite.
first_yearThe first year in the data.
last_yearThe last year in the data.

Links: race_name.race_id = race.race_id; race_result.race_id = race.race_id

Example, races and the years they cover:

SELECT name, category, first_year, last_year FROM race ORDER BY name

race_name

The external names of each race: how a source wrote its name, with the years it was used. A race that changed sponsor has several.

FieldMeaning
race_idWhich race: race.race_id.
nameThe name as the source wrote it, for example 'MINERVA CLASSIC BRUGGE - DE PANNE'.
sourceWhere the name comes from: uci for DataRide.
first_yearThe first year this name was used.
last_yearThe last year this name was used.

Links: race_id -> race.race_id

Example, every name each race has had:

SELECT r.name AS race, n.name AS external_name, n.first_year, n.last_year FROM race_name n JOIN race r ON r.race_id = n.race_id ORDER BY r.name, n.first_year

Where each race lives on the web: official site, Wikipedia, social media and FirstCycling.

FieldMeaning
race_idWhich race: race.race_id.
kindwebsite, wikipedia, wikidata, x, instagram, facebook, youtube, tiktok, firstcycling or other.
labelThe name to show for the link, for example Instagram.
urlThe address.
sourceWhere it came from: registry (the race registry of the Threads tab), wikidata (a match you checked) or manual (typed in).

Links: race_id -> race.race_id

Example, the links of every race that has any:

SELECT r.name, l.label, l.url FROM race_link l JOIN race r ON r.race_id = l.race_id ORDER BY r.name, l.kind

country

Every country code UCI uses, with its continent and UCI confederation, for filtering races, riders and teams by continent.

FieldMeaning
codeThe code UCI uses (IOC style): ITA, GER, SUI ... It is the value in queue_race.country, result_row.nation and team_rank.nation.
nameThe country's name.
continentEurope, Asia, Africa, North America (with Central America and the Caribbean), South America or Oceania.
confederationUCI's continental confederation: Europe, Asia, Africa, Pan America or Oceania.

Links: country.code = queue_race.country, result_row.nation, team_rank.nation

Example, races captured per continent:

SELECT c.continent, COUNT(*) AS races FROM queue_race q JOIN country c ON c.code = q.country GROUP BY c.continent ORDER BY races DESC

queue_race

The competitions to capture, taken from the DataRide competition list pages you captured.

FieldMeaning
uci_idDataRide's competition number for this edition.
yearThe year.
nameThe race name.
startFirst day, yyyy-mm-dd.
endLast day, yyyy-mm-dd (the same for a one-day race).
countryThe country (UCI's three-letter code).
hubWhere the line came from (DataRide).
classThe UCI class from the list, for example 2.UWT, 1.Pro, 1.1.
categoryME = men, WE = women, from the list's Category filter or the race name.
race_idWhich race this edition belongs to: race.race_id.

Links: uci_id = race_result.uci_id once the race has been captured; queue_event.uci_id = queue_race.uci_id

Example, races in the queue that are not captured yet:

SELECT q.year, q.name, q.start, q.hub FROM queue_race q WHERE q.uci_id NOT IN (SELECT uci_id FROM race_result) ORDER BY q.start

queue_event

The events of a queued competition (General Classification, each stage), read from its DataRide competition page.

FieldMeaning
uci_idWhich competition: queue_race.uci_id.
event_idDataRide's number for the event.
nameThe event's name, for example 'Stage 3'.

Links: uci_id -> queue_race.uci_id; event_id = classification.event_id once captured

Example, events still to capture:

SELECT q.year, q.name, e.name AS event FROM queue_event e JOIN queue_race q ON q.uci_id = e.uci_id WHERE e.event_id NOT IN (SELECT event_id FROM classification WHERE event_id IS NOT NULL) ORDER BY q.start, e.event_id

kv

Texts and settings you edit on the pages, stored with the data.

FieldMeaning
keyThe name: season (YAML), registry (YAML), layout (JSON), sharenote and a few more.
valueThe text.

Example, what is saved:

SELECT key, LENGTH(value) AS characters FROM kv ORDER BY key

meta

Facts about the database file itself.

FieldMeaning
keyThe name: schema_version; in a public file also public, beta, beta_note, credits, made, races, editions, results, first_year and last_year (what the file holds).
valueThe value. A file whose schema version is newer than the tool's is refused.

Example, the schema version:

SELECT key, value FROM meta

v_team_pointsview

team_rank with the season and date of its ranking: the easy way to ask about team points.

FieldMeaning
seasonThe season.
dateThe ranking date.
team_idUCI's team number.
codeThe team's code that season.
nameThe team's name that season.
nationThe team's nation.
rankPosition on that date.
pointsUCI World Ranking points, season to date.

Links: Group by team_id to follow one team through renames.

Example, one team over the years (uae has uci team number 595):

SELECT season, date, code, name, rank, points FROM v_team_points WHERE team_id = 595 ORDER BY date

v_resultsview

Every point-scoring result with its race, in one table: the easy way to ask about riders and results.

FieldMeaning
uci_idUCI's number for the race edition.
yearThe year.
raceThe race name.
classThe UCI class.
labelThe section of the page (for example Final Classification).
titleThe result list's title.
rankThe place.
riderThe rider.
teamThe team name on the race page.
nationThe rider's nation.
resultTime or gap.
pointsUCI points.
race_idThe race (the same in every year): race.race_id.
race_nameThe race's internal name, the same in every year. The column race is the external name UCI used that year.
ageThe rider's age at the time of the race, as DataRide shows it.

Example, points per team from the race results:

SELECT team, SUM(points) AS points, COUNT(DISTINCT uci_id) AS races FROM v_results GROUP BY team ORDER BY points DESC LIMIT 20