ROWS versus RANGE bij framing
Het subtiele en vaak getoetste verschil tussen frames op basis van rijen en op basis van waarden
ROWS versus RANGE bij framing is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op programmeerinterviews. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.
Het onderscheid waar gesprekspartners op doorvragen
Als je eenmaal een lopend totaal kunt schrijven, is de natuurlijke vervolgvraag: "Wat is het verschil tussen ROWS en RANGE in een windowframe?" Dit is een scherpe graadmeter voor kennis op middenniveau. Veel kandidaten gebruiken frames dagelijks zonder ooit te merken dat deze twee sleutelwoorden zich anders gedragen.
Beide definiëren de verzameling rijen die het aggregaat ziet, maar ze tellen die verzameling op fundamenteel verschillende manieren. Als je dit goed beheerst, val je op.
ROWS telt fysieke rijen
ROWS is positioneel. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW betekent letterlijk: de huidige rij plus de twee fysieke rijen die er direct boven staan in de geordende reeks.
Het maakt niet uit of aangrenzende rijen dezelfde ORDER BY-waarde hebben. Drie rijen betekent drie rijen, zonder uitzonderingen. Dit is de framekeuze die je bijna altijd wilt gebruiken voor voortschrijdende gemiddelden en strikte lopende totalen.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS rows_sum
FROM sales;RANGE telt op basis van waarde
RANGE is gebaseerd op waarden. De functie neemt elke rij op waarvan de ORDER BY-waarde binnen een logisch bereik van de waarde van de huidige rij valt, in plaats van een vast aantal rijen te tellen.
Het belangrijkste gevolg: met RANGE worden alle rijen met dezelfde ORDER BY-waarde behandeld als één groep van gelijkwaardige rijen. Ze krijgen allemaal hetzelfde frame en daardoor hetzelfde resultaat.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS range_sum
FROM sales;Het voorbeeld met gelijke waarden dat het verschil laat zien
Stel dat twee verkopen plaatsvinden op 2024-03-02, met bedragen 30 en 40, voorafgegaan door 2024-03-01 met een bedrag van 100.
- Met RANGE tot en met de huidige rij: beide rijen van 03-02 zijn gelijkwaardig, dus beide tonen 100 + 30 + 40 = 170.
- Met ROWS tot en met de huidige rij: de eerste rij van 03-02 toont 130 en de tweede 170, omdat elke rij het frame één positie verder uitbreidt.
Dezelfde gegevens, andere getallen. Dat verschil bij gelijke waarden vormt de kern van de vraag.
Waarom het standaardframe RANGE gebruikt
Onthoud dat OVER (ORDER BY ...) zonder expliciet frame standaard RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW gebruikt.
Dit betekent dat een eenvoudig lopend totaal stilzwijgend RANGE gebruikt. Bij unieke sorteersleutels is dat identiek aan ROWS, waardoor de fout verborgen blijft. Zodra er dubbele sorteerwaarden voorkomen, voegt je lopende totaal gelijke rijen ongemerkt samen. Daarom schrijven ervaren ontwikkelaars ROWS expliciet op.
RANGE met numerieke verschuivingen
RANGE kan een verschuiving op basis van een waarde gebruiken, niet alleen UNBOUNDED. RANGE BETWEEN 7 PRECEDING AND CURRENT ROW over een datum- of numerieke kolom bevat elke rij waarvan de waarde maximaal 7 eenheden van de huidige waarde afwijkt.
Bij datums levert dit een echt venster van de "laatste 7 dagen" op, waarbij ontbrekende dagen correct worden overgeslagen. ROWS 7 PRECEDING zou daarentegen de vorige 7 rijen pakken, ongeacht hiaten. Als je deze nuance kent, geef je een sterk antwoord.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW
) AS last_7_days
FROM sales;ROWS negeert hiaten
Het omgekeerde geldt ook: ROWS heeft geen begrip van hiaten in de gegevens. Als je verkooptabel geen weekenden bevat, beslaat ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 7 geregistreerde dagen, die in werkelijkheid twee kalenderweken kunnen omvatten.
De keuze hangt dus af van je bedoeling: de laatste N records betekent ROWS; de laatste N eenheden van een waarde (dagen, euro's) betekent RANGE met een verschuiving.
De realiteit van dialectondersteuning
Een eerlijk antwoord in een sollicitatiegesprek benoemt verschillen in ondersteuning:
- PostgreSQL ondersteunt
RANGEmet verschuivingen (sinds versie 11) en ondersteuntROWSvolledig. - SQL Server ondersteunt
ROWSenRANGE, maarRANGEalleen metUNBOUNDED/CURRENT ROW, niet met numerieke verschuivingen. - MySQL 8 ondersteunt beide, met beperkte typen voor verschuivingen bij
RANGE.
Als een numerieke verschuiving bij RANGE niet beschikbaar is, boots je die na met een koppeling van een tabel met zichzelf of met een gegenereerde kalender. Als je dit noemt, laat je zien dat je ook aan productieomgevingen denkt.
GROUPS: de derde modus
Er is een minder bekende derde frame-modus: GROUPS. Deze telt groepen met gelijke sorteerwaarden in plaats van rijen of waarden. GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW bevat de huidige groep met gelijke waarden en de groep ervoor.
Deze modus is zelden nodig, maar als je hem noemt wanneer iemand vraagt "zijn er nog andere framemodi?", toon je echte diepgang. PostgreSQL 11 en hoger en enkele andere systemen ondersteunen deze modus.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
) AS two_day_groups
FROM sales;Een beslisregel die je kunt opzeggen
Vat het hele onderwerp samen in één zin die je in een sollicitatiegesprek kunt zeggen:
"Gebruik ROWS als ik een vast aantal fysieke rijen bedoel, gebruik RANGE als ik een logisch bereik van de sorte waarde bedoel, en onthoud dat gelijke waarden ze van elkaar laten afwijken, omdat het standaardbereik gelijke waarden samenneemt."
Met die ene zin beantwoord je de vraag volledig en zelfverzekerd.
Vergelijking naast elkaar
Als je beide frame-indelingen in één query zet, wordt het verschil zichtbaar. Voer deze query uit op gegevens met dubbele datums en vergelijk de twee kolommen rij voor rij.
Bij unieke datums zijn de kolommen exact gelijk. Bij gelijke datums herhaalt de kolom met RANGE hetzelfde totaal voor alle gelijke waarden, terwijl de kolom met ROWS stap voor stap oploopt.
SELECT
sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_total,
SUM(amount) OVER (ORDER BY sale_date
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_total
FROM sales;Korte controle
Twee rijen hebben dezelfde waarde voor ORDER BY met een standaardframe. Wat gebeurt er?
Samenvatting: ROWS versus RANGE
ROWS telt fysieke rijen; RANGE telt op basis van de logische waarde van de sorteerkolom en behandelt gelijke waarden als een groep. Het standaardframe van OVER (ORDER BY ...) is RANGE. Daarom kan een eenvoudig lopend totaal dubbele sorteerwaarden als één groep behandelen.
Kies ROWS voor "de laatste N records" en bewegende vensters die ongevoelig zijn voor hiaten. Kies RANGE met een verschuiving voor "de laatste N dagen/euro's" waarbij hiaten meetellen. Weten dat GROUPS bestaat, is een bonus. Hierna gebruiken we frames met ROWS om bewegende gemiddelden te bouwen.
Leer Voorbereiding op programmeerinterviews met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 90
- Lessen
- 360
Veelgestelde vragen
Is de les “ROWS versus RANGE bij framing” gratis?
Ja — de volledige tekst van “ROWS versus RANGE bij framing” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op programmeerinterviews wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.
Wat leer ik in “ROWS versus RANGE bij framing”?
Het subtiele en vaak getoetste verschil tussen frames op basis van rijen en op basis van waarden Je oefent met Voorbereiding op programmeerinterviews door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Voorbereiding op programmeerinterviews te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op programmeerinterviews op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “ROWS versus RANGE bij framing”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op programmeerinterviews?
Ja. Elke les over Voorbereiding op programmeerinterviews bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Cumulatieve sommen met windowframes
- ROWS versus RANGE bij framing
- Voortschrijdende gemiddelden over een schuivend venster
- Cumulatieve verdeling en percentage van het totaal