SQL leren: Vensters per groep met PARTITION BY
Per ploeg, per rit
Elke ploeg wil haar eigen lijstje: wie is onze jongste, wie onze beste renner per rit? "Vier ploegen, vijf ritten. Dat zijn veel lijstjes", zucht Griet. Of één query die per groep opnieuw begint te tellen.
Opnieuw beginnen per groep
Met PARTITION BY in de OVER verdeel je de rijen in groepen. De window function begint in elke groep opnieuw: hier krijgt de jongste renner van elke ploeg nummer 1.
Anders dan bij GROUP BY blijven alle rijen staan. Je krijgt dus geen vier rijen, maar zestien, elk met een nummer binnen de eigen ploeg.
SELECT r.naam, p.naam AS ploeg, r.geboortedatum, ROW_NUMBER() OVER (PARTITION BY r.ploeg_id ORDER BY r.geboortedatum DESC) AS nr FROM renners r JOIN ploegen p ON p.id = r.ploeg_id| naam | ploeg | geboortedatum | nr |
|---|---|---|---|
| Milan Dhondt | Flandrien Pro | 2003-01-30 | 1 |
| Wout De Clercq | Flandrien Pro | 2001-07-02 | 2 |
| Lars Vermeulen | Flandrien Pro | 1999-03-14 | 3 |
| Jens Moreels | Flandrien Pro | 1997-11-23 | 4 |
| Tibo Lauwers | Pajot Cycling | 2002-09-17 | 1 |
| Arne Van Hecke | Pajot Cycling | 2000-05-09 | 2 |
| Senne Pauwels | Pajot Cycling | 1998-12-05 | 3 |
| Kasper Holm | Pajot Cycling | 1996-04-21 | 4 |
De beste per groep
Een klassieker: de beste rij per groep. Nummer eerst per groep in een WITH, en hou dan alleen nummer 1.
PARTITION BY mag ook meerdere kolommen hebben. Hier zie je per etappe de best geplaatste renner van elke ploeg: vijf ritten, vier ploegen, twintig rijen.
WITH gerangschikt AS (
SELECT u.etappe_id, r.ploeg_id, r.naam, u.plaats,
ROW_NUMBER() OVER (PARTITION BY u.etappe_id, r.ploeg_id ORDER BY u.plaats) AS nr
FROM uitslagen u JOIN renners r ON r.id = u.renner_id
)
SELECT etappe_id, ploeg_id, naam, plaats FROM gerangschikt WHERE nr = 1| etappe_id | ploeg_id | naam | plaats |
|---|---|---|---|
| 1 | 1 | Wout De Clercq | 10 |
| 1 | 2 | Arne Van Hecke | 6 |
| 1 | 3 | Ruben de Graaf | 2 |
| 1 | 4 | Louis Garnier | 1 |
| 2 | 1 | Jens Moreels | 3 |
| 2 | 2 | Tibo Lauwers | 5 |
| 2 | 3 | Jesper Kuipers | 1 |
| 2 | 4 | Hugo Lefèvre | 4 |
Probeer het zelf
Nummer de renners per ploeg, de oudste krijgt 1. Toon de naam, de ploeg_id en het nummer.
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