Op één na hoogste salaris: vijf manieren
Oplossingen met subquery, LIMIT/OFFSET en windowfunctie vergelijken
Op één na hoogste salaris: vijf manieren is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 1 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 vraag die iedereen krijgt
"Vind het op één na hoogste salaris" is de meest gestelde SQL-vraag tijdens sollicitatiegesprekken. Interviewers zijn er dol op omdat er veel juiste antwoorden zijn en verschillende subtiele valkuilen.
Ga uit van een tabel employee met de kolommen id en salary. Het is jouw taak om de op één na hoogste verschillende salariswaarde terug te geven.
- Als de salarissen 300, 200, 200, 100 zijn, is het antwoord 200, niet de tweede rij.
- Als er geen tweede verschillende salariswaarde is, is het verwachte antwoord meestal
NULL.
In de volgende scènes lossen we dit op vijf verschillende manieren op en bespreken we wanneer elke manier het beste werkt.
CREATE TABLE employee (
id INT PRIMARY KEY,
salary INT
);Manier 1: MAX van waarden onder de MAX
De meest intuïtieve oplossing: het op één na hoogste salaris is het grootste salaris dat strikt lager is dan het algemene maximum.
Dit leest bijna als gewone taal en werkt in elk SQL-dialect. De binnenquery vindt de hoogste waarde en de buitenste MAX vindt de grootste waarde daaronder.
Bonus: als er geen tweede verschillende salariswaarde is, aggregeert de buitenste MAX nul rijen en geeft deze automatisch NULL terug. Die automatisch verkregen NULL is precies wat interviewers willen.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Waarom de subquery duplicaten afhandelt
Let op: in Methode 1 hebben we nooit DISTINCT gebruikt, maar toch worden duplicaten correct afgehandeld.
Als drie mensen 200 verdienen en de best verdienende persoon 300 verdient, geeft de binnenste query 300 terug. Het buitenste filter houdt elke rij onder 300 over, en MAX daarvan is 200, ongeacht hoe vaak 200 voorkomt.
Dit is het belangrijkste inzicht: aggregaties voegen duplicaten voor je samen. Veel kandidaten maken het onnodig ingewikkeld met DISTINCT, terwijl de aggregatie al het juiste doet.
Methode 2: LIMIT met OFFSET
In MySQL en PostgreSQL kun je unieke salarissen in aflopende volgorde sorteren en de eerste overslaan.
OFFSET 1slaat het hoogste salaris over.LIMIT 1houdt alleen het volgende salaris over.
DISTINCT is hier essentieel. Anders zorgen dubbele hoogste salarissen ervoor dat OFFSET 1 op een herhaling van het maximum terechtkomt in plaats van op de echte nummer twee.
Valkuil: als er geen tweede unieke waarde is, geeft dit nul rijen terug, geen NULL. We lossen dat randgeval op in les 4.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;Methode 3: FETCH voor SQL Server en Oracle
SQL Server en moderne versies van Oracle ondersteunen LIMIT ... OFFSET niet. In plaats daarvan gebruiken ze de ANSI-standaardsyntaxis OFFSET ... FETCH.
De logica is identiek aan die van Methode 2: sorteer unieke salarissen in aflopende volgorde, sla één rij over en haal er één op. Als je de schrijfwijze voor verschillende dialecten kent, laat dat een interviewer zien dat je praktijkervaring hebt.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;Methode 4: de vensterfunctie DENSE_RANK
De moderne, schaalbare aanpak gebruikt een vensterfunctie. DENSE_RANK geeft het hoogste salaris rang 1, het volgende unieke salaris rang 2 en geeft gelijke salarissen dezelfde rang, zonder hiaten.
We berekenen de rang in een subquery en filteren vervolgens in de buitenste query op rang 2. Onthoud: je kunt niet rechtstreeks in WHERE op een vensterfunctie filteren, dus de subquery eromheen is verplicht.
SELECT salary AS second_highest
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = 2;Waarom DENSE_RANK en niet RANK of ROW_NUMBER
De keuze van de rangschikkingsfunctie is belangrijk voor de semantiek van "uniek":
ROW_NUMBERgeeft elke rij een uniek nummer. Twee mensen die 300 verdienen, worden dus rij 1 en 2, waardoor rang 2 een herhaling van het hoogste salaris is. Fout.RANKlaat hiaten na gelijke waarden: twee salarissen van 300 krijgen rang 1, waarna het volgende salaris naar rang 3 springt. Je mist dat salaris bij rang 2. Fout.DENSE_RANKgeeft gelijke waarden dezelfde rang en laat geen hiaten, waardoor rang 2 altijd het tweede unieke salaris is. Correct.
Methode 5: telling met een gecorreleerde subquery
Een klassieke truc van vóór de vensterfuncties: een salaris is het N-de hoogste als precies N-1 unieke salarissen er strikt boven liggen.
Voor het op één na hoogste salaris willen we precies één uniek salaris erboven. Dit is elegant, maar kan traag zijn voor grote tabellen omdat de binnenste telling voor elke buitenste rij opnieuw wordt uitgevoerd.
Je kunt dit eenvoudig generaliseren naar het N-de hoogste salaris door de telling te veranderen in N - 1. Daarom zien interviewers deze aanpak graag.
SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
SELECT COUNT(DISTINCT e2.salary)
FROM employee e2
WHERE e2.salary > e.salary
);Een volledig uitgewerkt voorbeeld
Neem de salarissen 500, 500, 350, 350, 100.
- Methode 1: MAX is 500; de grootste waarde onder 500 is 350. Het antwoord is 350.
- Methode 4 (DENSE_RANK): 500 -> rang 1, 350 -> rang 2, 100 -> rang 3. Rang 2 is 350.
- Methode 5: voor salaris 350 is precies één uniek salaris (500) hoger. Dit komt overeen. Het antwoord is 350.
Alle vijf methoden geven hetzelfde antwoord: het op één na hoogste unieke salaris is 350, ook als er duplicaten aanwezig zijn.
Welke methode kies je
Tips voor het sollicitatiegesprek:
- Formuleer eerst de vraag: "Wil je unieke salarissen en
NULLals er geen bestaat?" Door verduidelijking te vragen scoor je punten. - DENSE_RANK is het sterkste standaardantwoord; je kunt het netjes generaliseren naar het N-de hoogste salaris en naar groepen.
- MAX-onder-MAX is de beste oplossing op één regel en geeft vanzelf
NULLterug. - LIMIT/OFFSET is compact, maar dialectspecifiek en geeft bij het randgeval geen rijen terug.
Als je de afwegingen hardop benoemt, onderscheid je een antwoord op mediorniveau van een antwoord op juniorniveau.
Veelgemaakte fouten om te vermijden
Let op deze valkuilen die interviewers inbouwen:
ROW_NUMBERgebruiken in plaats vanDENSE_RANKen het hoogste salaris twee keer krijgen.DISTINCTvergeten in de LIMIT/OFFSET-versie als er meerdere maximale salarissen zijn.- Aannemen dat
ORDER BY salary DESC LIMIT 1,1een unieke waarde teruggeeft. Dat doet het niet. - De tweede rij teruggeven in plaats van de tweede waarde.
Korte controle
Test je begrip van de keuze van de rangschikkingsfunctie.
Samenvatting
Je hebt nu vijf manieren om het op één na hoogste salaris te vinden:
- MAX onder MAX - platformonafhankelijk en geeft vanzelf
NULLterug. - LIMIT/OFFSET en OFFSET/FETCH - compact en dialectspecifiek.
- DENSE_RANK - de schaalbare standaardaanpak die gelijke waarden correct afhandelt.
- Gecorreleerde telling - elegant en te generaliseren naar het N-de hoogste salaris.
Belangrijkste punten: vraag of je unieke waarden nodig hebt, geef bij gelijke waarden de voorkeur aan DENSE_RANK en onthoud welke methoden NULL teruggeven en welke geen rijen teruggeven als er geen tweede waarde bestaat.
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 “Op één na hoogste salaris: vijf manieren” gratis?
Ja — de volledige tekst van “Op één na hoogste salaris: vijf manieren” 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 “Op één na hoogste salaris: vijf manieren”?
Oplossingen met subquery, LIMIT/OFFSET en windowfunctie vergelijken 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 1 van 4.
Hoe lang duurt de les “Op één na hoogste salaris: vijf manieren”?
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
- Op één na hoogste salaris: vijf manieren
- De op N-na hoogste waarde met DENSE_RANK
- Hoogstverdienende medewerker per afdeling
- NULL retourneren als er geen N-de waarde bestaat