OnderwerpenSpiekbriefjeLessen
Lurndo › Onderwerpen › Rangschikken met RANK en DENSE_RANK

SQL leren: Rangschikken met RANK en DENSE_RANK

Gelijke tijd

In de heuvelrit naar Galmaarden kwamen de renners in groepjes over de meet. Wie samen aankomt, krijgt dezelfde tijd. "Dan delen ze ook hun plaats in de tijdsuitslag", zegt Griet. `ROW_NUMBER` kent geen gedeelde plaatsen. Tijd voor iets beters.

Gedeelde plaatsen

RANK() werkt als ROW_NUMBER(), maar rijen met dezelfde waarde krijgen hetzelfde nummer. Daarna slaat hij plaatsen over: na drie renners op plaats 2 komt plaats 5.

Hier de achterstand in etappe 3, in seconden. De WHERE loopt eerst, dus alleen de renners van die rit worden gerangschikt.

SELECT r.naam, u.achterstand, RANK() OVER (ORDER BY u.achterstand) AS rang FROM uitslagen u JOIN renners r ON r.id = u.renner_id WHERE u.etappe_id = 3
Resultaat
naamachterstandrang
Wout De Clercq01
Tibo Lauwers422
Jesper Kuipers422
Louis Garnier422
Arne Van Hecke945
Kasper Holm945
Ruben de Graaf945
Jens Moreels1628

Drie manieren van tellen

Naast elkaar, voor etappe 4. ROW_NUMBER geeft altijd verschillende nummers, ook bij gelijke tijd: wie dan voorgaat, kiest SQLite zelf. RANK deelt plaatsen en slaat daarna over. DENSE_RANK deelt ook, maar slaat niets over: na drie keer 2 komt 3.

SELECT renner_id, achterstand,
ROW_NUMBER() OVER (ORDER BY achterstand) AS rij,
RANK() OVER (ORDER BY achterstand) AS rang,
DENSE_RANK() OVER (ORDER BY achterstand) AS dicht
FROM uitslagen WHERE etappe_id = 4
Resultaat
renner_idachterstandrijrangdicht
110111
218222
1038333
1338433
965554
373665
873765
1273865

Rangschikken na GROUP BY

Window functions lopen na GROUP BY. Daarom mag je rangschikken op een totaal: RANK() OVER (ORDER BY SUM(...) DESC).

Hier het ploegenklassement op punten: eerst per ploeg optellen, dan rangschikken.

SELECT p.naam AS ploeg, SUM(u.punten) AS punten,
RANK() OVER (ORDER BY SUM(u.punten) DESC) AS plaats
FROM uitslagen u
JOIN renners r ON r.id = u.renner_id
JOIN ploegen p ON p.id = r.ploeg_id
GROUP BY p.id, p.naam
Resultaat
ploegpuntenplaats
Polderwind941
Équipe Nord722
Flandrien Pro573
Pajot Cycling414

Probeer het zelf

Maak het puntenklassement van de renners. Toon de naam, het totaal aantal punten en de plaats. Wie evenveel punten heeft, deelt de plaats en de volgende plaats wordt overgeslagen.

Klaar voor meer?

De volledige les heeft 5 oefeningen, van makkelijk naar uitdagend, met hints, punten en een reeks die je kan opbouwen.

Begin aan de les
← VorigeEen nummer per rijVolgende →Per ploeg, per rit
SQL-onderwerpenSpiekbriefjeExcelRanglijstAccountPrivacyEnglish