Il secondo stipendio più alto: cinque metodi
Confrontare le soluzioni con sottoquery, LIMIT/OFFSET e funzioni finestra
Il secondo stipendio più alto: cinque metodi è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.
La domanda che capita a tutti
"Trovi il secondo stipendio più alto" è la domanda più frequente nei colloqui SQL. Gli intervistatori la apprezzano perché ammette molte risposte corrette e presenta diverse insidie.
Supponga di avere una tabella employee con le colonne id e salary. Il suo compito è restituire il secondo valore di stipendio distinto più alto.
- Se gli stipendi sono 300, 200, 200, 100, la risposta è 200, non la seconda riga.
- Se non esiste un secondo stipendio distinto, la risposta attesa è solitamente
NULL.
Nelle prossime scene risolveremo il problema in cinque modi diversi e vedremo quando ciascuno è più adatto.
CREATE TABLE employee (
id INT PRIMARY KEY,
salary INT
);Metodo 1: MAX dei valori inferiori al MAX
La soluzione più intuitiva: il secondo stipendio più alto è lo stipendio maggiore che sia strettamente inferiore al massimo complessivo.
Questa soluzione è quasi leggibile come una frase in inglese e funziona in ogni dialetto SQL. La sottoquery interna trova il valore più alto e il MAX esterno trova il valore maggiore tra quelli inferiori.
Vantaggio aggiuntivo: se non esiste un secondo stipendio distinto, il MAX esterno aggrega zero righe e restituisce automaticamente NULL. Questo NULL gratuito è esattamente ciò che gli intervistatori vogliono.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Perché la sottoquery gestisce i duplicati
Notate che nel Metodo 1 non abbiamo mai usato DISTINCT, eppure i duplicati vengono gestiti correttamente.
Se tre persone guadagnano 200 e la persona con lo stipendio più alto guadagna 300, la query interna restituisce 300. Il filtro esterno mantiene ogni riga con un valore inferiore a 300 e il MAX di queste righe è 200, indipendentemente dal numero di volte in cui compare 200.
Questo è il punto fondamentale: gli aggregati eliminano per voi l'effetto dei duplicati. Molti candidati complicano inutilmente la soluzione con DISTINCT, anche quando l'aggregato fa già la cosa giusta.
Metodo 2: LIMIT con OFFSET
In MySQL e PostgreSQL potete ordinare gli stipendi distinti in ordine decrescente e saltare il primo.
OFFSET 1salta lo stipendio più alto.LIMIT 1mantiene soltanto quello successivo.
DISTINCT è essenziale in questo caso; altrimenti, se lo stipendio più alto è duplicato, OFFSET 1 si posizionerebbe su un'altra occorrenza del valore massimo invece che sul vero secondo valore più alto.
Attenzione: se non esiste un secondo valore distinto, questa query restituisce zero righe, non NULL. Risolveremo questo caso limite nella lezione 4.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;Metodo 3: FETCH per SQL Server e Oracle
SQL Server e le versioni moderne di Oracle non supportano LIMIT ... OFFSET. Utilizzano invece la sintassi standard ANSI OFFSET ... FETCH.
La logica è identica a quella del Metodo 2: ordinare gli stipendi distinti in ordine decrescente, saltare una riga e recuperarne una. Conoscere la sintassi equivalente nei diversi dialetti SQL dimostra esperienza pratica a chi conduce il colloquio.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;Metodo 4: funzione finestra DENSE_RANK
L'approccio moderno e scalabile utilizza una funzione finestra. DENSE_RANK assegna il rango 1 allo stipendio più alto, il rango 2 al successivo stipendio distinto e assegna lo stesso rango agli stipendi a pari merito, senza lasciare lacune.
Calcoliamo il rango in una sottoquery e poi filtriamo per il rango 2 nella query esterna. Ricordate: non potete filtrare direttamente su una funzione finestra in WHERE, quindi l'involucro della sottoquery è obbligatorio.
SELECT salary AS second_highest
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = 2;Perché DENSE_RANK, non RANK o ROW_NUMBER
La scelta della funzione di ranking è importante per la semantica dei valori "distinti":
ROW_NUMBERassegna un numero univoco a ogni riga, quindi due persone che guadagnano 300 occuperebbero le righe 1 e 2 e il rango 2 sarebbe una ripetizione dello stipendio più alto. Sbagliato.RANKlascia delle lacune dopo i pari merito: due stipendi pari a 300 ricevono il rango 1, poi lo stipendio successivo passa direttamente al rango 3. Lo perdereste cercando il rango 2. Sbagliato.DENSE_RANKassegna lo stesso rango ai pari merito e non lascia lacune, quindi il rango 2 corrisponde sempre al secondo stipendio distinto più alto. Corretto.
Metodo 5: conteggio con sottoquery correlata
Un classico espediente precedente alle funzioni finestra: uno stipendio è l'N-esimo più alto se esistono esattamente N-1 stipendi distinti strettamente superiori.
Per il secondo stipendio più alto, vogliamo esattamente uno stipendio distinto superiore. È una soluzione elegante, ma può essere lenta su tabelle di grandi dimensioni perché il conteggio interno viene eseguito per ogni riga esterna.
Si generalizza facilmente all'N-esimo stipendio più alto sostituendo il conteggio con N - 1, motivo per cui piace ai selezionatori.
SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
SELECT COUNT(DISTINCT e2.salary)
FROM employee e2
WHERE e2.salary > e.salary
);Un esempio completo dall'inizio alla fine
Considerate gli stipendi: 500, 500, 350, 350, 100.
- Metodo 1: il valore massimo è 500; il valore più grande inferiore a 500 è 350. Risposta: 350.
- Metodo 4 (DENSE_RANK): 500 -> rango 1, 350 -> rango 2, 100 -> rango 3. Il rango 2 corrisponde a 350.
- Metodo 5: per lo stipendio 350 esiste esattamente uno stipendio distinto superiore, ovvero 500. Corrispondenza trovata. Risposta: 350.
Tutti e cinque i metodi concordano: il secondo stipendio distinto più alto è 350, anche in presenza di duplicati.
Quale metodo scegliere
Indicazioni per il colloquio:
- Chiarite prima la domanda: "Servono stipendi distinti e
NULLse non ne esiste nessuno?" Fare domande di chiarimento porta punti. - DENSE_RANK è la risposta predefinita più solida; si generalizza in modo pulito all'N-esimo valore e ai calcoli per gruppo.
- MAX sotto MAX è la soluzione su una sola riga migliore e restituisce
NULLautomaticamente. - LIMIT/OFFSET è conciso, ma dipende dal dialetto SQL e nel caso limite restituisce zero righe.
Esporre ad alta voce i compromessi è ciò che distingue una risposta di livello intermedio da una risposta junior.
Errori comuni da evitare
Prestate attenzione a queste trappole che i selezionatori inseriscono nelle domande:
- Usare
ROW_NUMBERinvece diDENSE_RANKe ottenere due volte lo stipendio più alto. - Dimenticare
DISTINCTnella versione con LIMIT/OFFSET quando il valore massimo compare più volte. - Supporre che
ORDER BY salary DESC LIMIT 1,1restituisca un valore distinto: non è così. - Restituire la seconda riga invece del secondo valore.
Verifica rapida
Verificate la vostra comprensione della scelta della funzione di ranking.
Riepilogo
Ora conoscete cinque modi per trovare il secondo stipendio più alto:
- MAX sotto MAX - portabile e restituisce
NULLautomaticamente. - LIMIT/OFFSET e OFFSET/FETCH - concisi, ma specifici del dialetto SQL.
- DENSE_RANK - la scelta predefinita scalabile che gestisce correttamente i pari merito.
- Conteggio correlato - elegante e generalizzabile all'N-esimo valore.
Punti chiave: chiedete se servono valori distinti, preferite DENSE_RANK per gestire i pari merito e ricordate quali metodi restituiscono NULL e quali zero righe quando il secondo valore non esiste.
Domande Frequenti
La lezione «Il secondo stipendio più alto: cinque metodi» è gratuita?
Sì — il testo completo di «Il secondo stipendio più alto: cinque metodi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.
Cosa imparerò in «Il secondo stipendio più alto: cinque metodi»?
Confrontare le soluzioni con sottoquery, LIMIT/OFFSET e funzioni finestra Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Interview Prep?
Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Il secondo stipendio più alto: cinque metodi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?
Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Il secondo stipendio più alto: cinque metodi
- L'ennesimo valore più alto con DENSE_RANK
- Il reddito più alto per reparto
- Restituire NULL quando non esiste l'ennesimo valore