Voorbereiding op programmeerinterviews · Les

Op één na hoogste salaris: vijf manieren

Oplossingen met subquery, LIMIT/OFFSET en windowfunctie vergelijken

Les 1 van 413 stappen

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 1 slaat het hoogste salaris over.
  • LIMIT 1 houdt 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_NUMBER geeft 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.
  • RANK laat 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_RANK geeft 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 NULL als 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 NULL terug.
  • 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_NUMBER gebruiken in plaats van DENSE_RANK en het hoogste salaris twee keer krijgen.
  • DISTINCT vergeten in de LIMIT/OFFSET-versie als er meerdere maximale salarissen zijn.
  • Aannemen dat ORDER BY salary DESC LIMIT 1,1 een 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 NULL terug.
  • 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.

Gratis beginnen

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

  1. Op één na hoogste salaris: vijf manieren
  2. De op N-na hoogste waarde met DENSE_RANK
  3. Hoogstverdienende medewerker per afdeling
  4. NULL retourneren als er geen N-de waarde bestaat
← Terug naar Voorbereiding op programmeerinterviews