Näst högsta lönen på fem sätt
Jämför lösningar med underfråga, LIMIT/OFFSET och fönsterfunktioner
Näst högsta lönen på fem sätt är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Frågan som alla får
"Hitta den näst högsta lönen" är den vanligaste SQL-frågan i intervjuer. Intervjuare tycker om den eftersom det finns många korrekta svar och flera subtila fallgropar.
Anta en tabell employee med kolumnerna id och salary. Uppgiften är att returnera det näst högsta distinkta lönevärdet.
- Om lönerna är 300, 200, 200, 100 är svaret 200, inte den andra raden.
- Om det inte finns någon näst högsta distinkt lön är det förväntade svaret vanligtvis
NULL.
I de följande avsnitten löser vi problemet på fem olika sätt och diskuterar när varje metod passar bäst.
CREATE TABLE employee (
id INT PRIMARY KEY,
salary INT
);Metod 1: MAX av värden under MAX
Den mest intuitiva lösningen: den näst högsta lönen är den största lönen som är strikt mindre än det övergripande maximumet.
Detta liknar nästan vanlig engelska och fungerar i alla SQL-dialekter. Den inre underfrågan hittar det högsta värdet, och den yttre MAX hittar det största värdet under detta.
Bonus: om det inte finns någon näst högsta distinkt lön aggregerar den yttre MAX noll rader och returnerar automatiskt NULL. Det kostnadsfria NULL-värdet är precis vad intervjuare vill se.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Varför underfrågan hanterar dubbletter
Lägg märke till att vi aldrig använde DISTINCT i metod 1, men dubbletter hanteras ändå korrekt.
Om tre personer tjänar 200 och den bäst betalda tjänar 300, returnerar den inre frågan 300. Det yttre filtret behåller alla rader under 300, och MAX av dem blir 200 oavsett hur många 200-värden som finns.
Det här är den viktiga insikten: aggregeringsfunktioner slår ihop dubbletter åt dig. Många kandidater överkonstruerar lösningen med DISTINCT när aggregeringsfunktionen redan gör rätt sak.
Metod 2: LIMIT med OFFSET
I MySQL och PostgreSQL kan du sortera unika löner i fallande ordning och hoppa över den första.
OFFSET 1hoppar över den högsta.LIMIT 1behåller bara nästa.
DISTINCT är avgörande här. Annars skulle dubbletter av den högsta lönen göra att OFFSET 1 hamnar på en upprepning av maximumvärdet i stället för den faktiska näst högsta lönen.
Fallgrop: om det inte finns något andra unikt värde returnerar detta noll rader, inte NULL. Vi åtgärdar det specialfallet i lektion 4.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;Metod 3: FETCH för SQL Server och Oracle
SQL Server och moderna Oracle stöder inte LIMIT ... OFFSET. I stället använder de ANSI-standardens syntax OFFSET ... FETCH.
Logiken är identisk med metod 2: sortera unika löner i fallande ordning, hoppa över en rad och hämta en. Att känna till syntaxen i olika databasmiljöer visar en intervjuare att du har erfarenhet från verkligheten.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;Metod 4: fönsterfunktionen DENSE_RANK
Den moderna, skalbara metoden använder en fönsterfunktion. DENSE_RANK tilldelar rang 1 till den högsta lönen, rang 2 till nästa unika lön och ger lika löner samma rang utan luckor.
Vi beräknar rangen i en underfråga och filtrerar sedan på rang 2 i den yttre frågan. Kom ihåg att du inte kan filtrera direkt på en fönsterfunktion i WHERE, så omslutningen med en underfråga är obligatorisk.
SELECT salary AS second_highest
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = 2;Varför DENSE_RANK, inte RANK eller ROW_NUMBER
Valet av rangordningsfunktion har betydelse för semantiken hos "unika" värden:
ROW_NUMBERger varje rad ett unikt nummer. Två personer med lönen 300 skulle alltså hamna på rad 1 och 2, och rang 2 skulle vara en upprepning av den högsta lönen. Fel.RANKlämnar luckor efter lika värden: två löner på 300 får rang 1, och nästa lön hoppar till rang 3. Du skulle missa den på rang 2. Fel.DENSE_RANKger lika värden samma rang utan luckor, så rang 2 är alltid den näst högsta unika lönen. Rätt.
Metod 5: korrelerad underfråga med räkning
Ett klassiskt knep från tiden före fönsterfunktioner: en lön är den N:e högsta om exakt N-1 unika löner är strikt högre än den.
För den näst högsta lönen vill vi ha exakt en unik lön över den. Metoden är elegant, men kan vara långsam i stora tabeller eftersom den inre räkningen körs för varje yttre rad.
Den generaliseras smidigt till den N:e högsta genom att ändra räkningen till N - 1, vilket är en anledning till att intervjuare gärna ser den.
SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
SELECT COUNT(DISTINCT e2.salary)
FROM employee e2
WHERE e2.salary > e.salary
);Ett genomarbetat exempel från början till slut
Anta lönerna: 500, 500, 350, 350, 100.
- Metod 1: MAX är 500 och det största värdet under 500 är 350. Svaret är 350.
- Metod 4 (DENSE_RANK): 500 -> rang 1, 350 -> rang 2, 100 -> rang 3. Rang 2 är 350.
- Metod 5: för lönen 350 är exakt en unik lön (500) högre. Träff. Svaret är 350.
Alla fem metoder ger samma resultat: den näst högsta unika lönen är 350, även när det finns dubbletter.
Vilken metod bör du välja
Råd inför intervjun:
- Formulera frågan först: "Vill du ha unika löner och NULL om ingen finns?" Att be om ett förtydligande ger poäng.
- DENSE_RANK är det bästa standardvalet; metoden generaliseras enkelt till den N:e högsta och till grupper.
- MAX under MAX är den bästa enrads lösningen och returnerar NULL automatiskt.
- LIMIT/OFFSET är kortfattat, men dialektspecifikt och returnerar inga rader i specialfallet.
Att tydligt nämna avvägningarna är det som skiljer ett svar på mellannivå från ett juniorsvar.
Vanliga misstag att undvika
Se upp för de här fallgroparna som intervjuare brukar lägga in:
- Att använda
ROW_NUMBERi stället förDENSE_RANKoch få den högsta lönen två gånger. - Att glömma
DISTINCTi LIMIT/OFFSET-versionen när det finns flera med den högsta lönen. - Att anta att
ORDER BY salary DESC LIMIT 1,1returnerar ett unikt värde, vilket det inte gör. - Att returnera den andra raden i stället för det andra värdet.
Snabbtest
Testa din förståelse av valet av rangordningsfunktion.
Sammanfattning
Du har nu fem sätt att hitta den näst högsta lönen:
- MAX under MAX – portabelt och returnerar NULL automatiskt.
- LIMIT/OFFSET och OFFSET/FETCH – kortfattade och dialektspecifika.
- DENSE_RANK – det skalbara standardvalet som hanterar lika löner korrekt.
- Korrelerad räkning – elegant och generaliseras till den N:e högsta.
Viktigast att komma ihåg: fråga om du behöver unika värden, föredra DENSE_RANK för lika löner och kom ihåg vilka metoder som returnerar NULL respektive inga rader när det inte finns något andra värde.
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Näst högsta lönen på fem sätt” gratis?
Ja – hela texten till ”Näst högsta lönen på fem sätt” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”Näst högsta lönen på fem sätt”?
Jämför lösningar med underfråga, LIMIT/OFFSET och fönsterfunktioner Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Näst högsta lönen på fem sätt”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Näst högsta lönen på fem sätt
- Det n:te högsta värdet med DENSE_RANK
- Högst avlönad per avdelning
- Returnera NULL när inget n:te värde finns