De Top-N-rijen betrouwbaar retourneren
Waarom ORDER BY plus LIMIT zonder tie-breaker niet-deterministisch kan zijn
De Top-N-rijen betrouwbaar retourneren is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 3 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.
De verborgen fout in Top-N-query's
"Geef me de vijf werknemers met het hoogste salaris" klinkt eenvoudig: ORDER BY salary DESC LIMIT 5. Maar interviewers bouwen een valkuil in. Wat als zes mensen hetzelfde salaris hebben op de grens? Wat als veel rijen gelijk eindigen?
Het kernprobleem is determinisme: wanneer de sorteersleutel gelijke waarden bevat, kapt LIMIT willekeurig af en kunnen de exacte geretourneerde rijen per uitvoering verschillen. Deze les maakt Top-N betrouwbaar.
Waarom ORDER BY + LIMIT niet-deterministisch kan zijn
Stel dat de salarissen op rang 4, 5 en 6 allemaal 50000 zijn. ORDER BY salary DESC LIMIT 5 moet precies 5 rijen retourneren, dus het behoudt twee van de drie rijen met dezelfde waarde en laat er één weg, maar welke twee dat zijn is onbepaald.
Voer de query twee keer uit, of voer die opnieuw uit nadat de optimizer andere uitvoeringsplannen kiest, en je kunt andere mensen krijgen. Die niet-deterministische uitkomst is de fout die interviewers willen dat je ontdekt.
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;Oplossing 1: voeg een unieke tie-breaker toe
De eenvoudigste oplossing is om de sorteervolgorde volledig te maken door een kolom toe te voegen die uniek is, meestal de primaire sleutel. Nu zijn geen twee rijen gelijk op de volledige sleutel, waardoor de afkapgrens deterministisch en reproduceerbaar is.
Dit verandert niet welke salarissen verschijnen, maar het maakt de keuze tussen rijen met dezelfde waarde stabiel tussen uitvoeringen.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 5;Oplossing 2: behoud alle gelijke waarden met WITH TIES
Soms is de vereiste "iedereen behouden die gelijk eindigt met de grenswaarde" in plaats van precies N rijen retourneren. Standaard-SQL en SQL Server bieden WITH TIES, dat extra rijen retourneert die dezelfde waarde voor ORDER BY hebben als de laatste rij.
Als het vijfde salaris door drie mensen wordt gedeeld, retourneert dit 7 rijen. Let op: WITH TIES vereist een ORDER BY.
SELECT name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS WITH TIES;Verduidelijk eerst de vereiste
Vraag de interviewer voordat je code schrijft: "Als er gelijke waarden op de grens zijn, wil je dan precies N rijen of alle rijen met dezelfde waarde?" Deze ene verduidelijkende vraag toont senioriteit.
- Precies N, stabiel: voeg een unieke tie-breaker toe.
- Alle gelijke waarden opnemen: gebruik
WITH TIESofRANK. - Verschillende waarden: gebruik
DENSE_RANK.
De overdraagbare aanpak met vensterfuncties
Veel engines hebben geen WITH TIES. Het overdraagbare, krachtige patroon gebruikt een rangschikkende vensterfunctie in een subquery of CTE en filtert daarna op de rang. ROW_NUMBER geeft precies N rijen met een deterministische sorteersleutel.
Je moet de vensterfunctie omhullen, omdat je er niet rechtstreeks naar kunt verwijzen in WHERE.
SELECT name, salary
FROM (
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 5;RANK om gelijke waarden te behouden
Vervang ROW_NUMBER door RANK wanneer je alle rijen met dezelfde waarde wilt behouden en hiaten in de nummering wilt hebben. Als drie rijen gelijk eindigen op rang 4, krijgen ze alle drie rang 4 en is de volgende rang 7.
Filteren met rank <= 5 retourneert vervolgens elke rij in de bovenste vijf salarisposities, inclusief gelijke waarden.
SELECT name, salary
FROM (
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk <= 5;DENSE_RANK voor Top-N verschillende waarden
"De drie hoogste salarisniveaus" (niet de drie best betaalde mensen) betekent verschillende waarden. DENSE_RANK geeft gelijke waarden dezelfde rang en slaat geen nummers over, dus dense_rnk <= 3 retourneert iedereen die een van de drie hoogste verschillende salarissen verdient.
Weten welke rangschikkingsfunctie bij welke formulering hoort, is een klassiek onderscheidend inzicht.
SELECT name, salary
FROM (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees
) ranked
WHERE drnk <= 3;Speciaal geval voor Top-1
Voor de ene bovenste rij werkt ORDER BY ... LIMIT 1, maar dit houdt nog steeds risico op gelijke waarden in. Als je elke rij wilt die de maximumwaarde heeft, vergelijk je met een subquery voor het maximum of gebruik je RANK() = 1.
De vorm met een subquery voor het maximum is duidelijk en werkt in elk dialect.
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);De aanpakken vergelijken
Samenvatting van wanneer je elk hulpmiddel gebruikt voor betrouwbare Top-N-resultaten:
LIMIT+ unieke tie-breaker: precies N rijen, stabiel en eenvoudig.FETCH ... WITH TIES: precies N plus gelijke waarden op de grens, standaard-SQL.ROW_NUMBER: precies N, deterministisch en volledig overdraagbaar.RANK: de bovenste N posities, inclusief alle gelijke waarden.DENSE_RANK: de bovenste N verschillende waarden.
Voorproefje: Top-N per groep
De aanpak met vensterfuncties generaliseert uitstekend. Voeg PARTITION BY toe om de bovenste N binnen elke groep te krijgen, bijvoorbeeld de twee best verdienende werknemers per afdeling. Hetzelfde filter rn <= n geldt na het opdelen in groepen.
Top-N per groep is een van de meest voorkomende problemen in echte interviews en is gebaseerd op precies het patroon dat je net hebt geleerd.
SELECT department, name, salary
FROM (
SELECT department, name, salary,
ROW_NUMBER() OVER (PARTITION BY department
ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 2;Snelle controle
Koppel de vereiste aan de juiste functie.
Samenvatting
Om Top-N betrouwbaar terug te geven:
- Alleen
ORDER BY ... LIMITis niet-deterministisch wanneer de sorteersleutel gelijke waarden bevat. - Voeg een unieke tie-breaker toe voor stabiele resultaten met precies N rijen.
- Gebruik
WITH TIESofRANKom gelijke waarden op de grens te behouden. - Gebruik
DENSE_RANKvoor de bovenste N verschillende waarden. - Verduidelijk altijd of de interviewer precies N rijen of alle gelijke waarden wil.
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 “De Top-N-rijen betrouwbaar retourneren” gratis?
Ja — de volledige tekst van “De Top-N-rijen betrouwbaar retourneren” 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 “De Top-N-rijen betrouwbaar retourneren”?
Waarom ORDER BY plus LIMIT zonder tie-breaker niet-deterministisch kan zijn 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 3 van 4.
Hoe lang duurt de les “De Top-N-rijen betrouwbaar retourneren”?
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
- Sorteren op meerdere kolommen en NULL-plaatsing
- LIMIT, OFFSET en FETCH FIRST
- De Top-N-rijen betrouwbaar retourneren
- Sorteren op expressies en aliassen