La domanda più comune e importante posta nelle interviste è come possiamo trovare l'ennesimo stipendio più alto in una tabella (2 stipendi più alti, 3 stipendi più alti o ennesimo stipendio più alto), dove N potrebbe essere 2, 3, 4, 5 o altro.
Ogni programmatore sa che il modo più semplice per trovare lo stipendio n più alto è usare SQL (Structured Query Language) in una tabella.
Ogni volta che l'intervistatore ti fa una domanda sul 2 stipendio più alto, il 4 stipendio più alto e così via, per risolvere questa domanda, dovremmo conoscere alcuni concetti importanti come una sottoquery, una funzione da utilizzare come row_num(), Rank Rank () , ecc.
Questo articolo ti farà conoscere diversi modi per trovare lo stipendio più alto N.
Considera le tabelle esistenti che hanno i seguenti record:
Tabella:Dipendenti
ID DIPENDENTE | FIRST_NAME | COGNOME | STIPENDIO | CITTÀ | REPARTO | RIDESTORE |
1001 | VAIBHAVI | MISHRA | 65500 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60000 | NOIDA | C# | 5 |
1003 | NICHIL | VANI | 50500 | JAIPUR | FM | 2 |
2001 | PRACHI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FM | 2 |
2003 | RUCHIKA | JAIN | 50000 | MUMBAI | C# | 5 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | JAIPUR | FM | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | PROVA | 4 |
4002 | ASHWINI | BAGAGLIO | 54500 | NOIDA | JAVA | 3 |
4003 | RUCHIKA | AGARWAL | 60000 | DELHI | ORACLE | 1 |
5001 | ARCHIT | SHARMA | 55500 | DELHI | PROVA | 4 |
N stipendio più alto utilizzando una sottoquery correlata
Una sottoquery correlata è un tipo speciale di sottoquery, in cui la sottoquery dipende dalla query principale e viene eseguita per ogni riga restituita dalla query principale.
Sintassi:
SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Dove N può essere sostituito con i numeri 23 o 4.
Esempio 1: Scrivi una query per trovare il 4 stipendio più alto:
SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Dove N =4, N -1:4 -1 =3.
4 stipendio più alto dal tavolo
Risultato:
Employeeid | Stipendio |
3003 | 58500 |
Spiegazione:
La parola chiave distinta è lì per gestire gli stipendi duplicati nella tabella. Per cercare lo stipendio più alto N, prendiamo in considerazione solo gli stipendi non duplicati. Lo stipendio più alto significa che nessuno stipendio è più alto di esso. Il secondo stipendio più alto significa che solo uno stipendio è maggiore di esso. Il terzo stipendio più alto significa che solo due stipendi sono superiori al terzo stipendio, allo stesso modo l'ennesimo stipendio più alto significa che gli stipendi N-1 sono maggiori di esso.
Il quarto stipendio più alto è 58500 di ID dipendente 3003.
Esempio 2:scrivi una query per trovare il 3 stipendio più alto:
SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Dove N =3, N -1:3 -1 =2.
2 stipendio più alto dal tavolo
Risultato:
Employeeid | Stipendio |
1002 | 60000 |
4003 | 60000 |
Il secondo stipendio più alto è 58500 di due dipendenti ID 1002 e ID dipendente 4003.
Esempio 3:scrivi una query per trovare il 5 stipendio più alto:
SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Dove N =6, N -1:6 -1 =5.
5 stipendio più alto dal tavolo
Risultato:
Employeeid | Stipendio |
4002 | 54500 |
Il quinto stipendio più alto è 54500 di ID dipendente 4002.
N Stipendio più alto utilizzando la parola chiave LIMIT
Sintassi:
SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;
Esempio 1: Scrivi una query per trovare 2 stipendi più alti.
SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;
Risultato:
Employeeid | Stipendio |
2002 | 65500 |
Il limite 1, 1 nella query dice quanto deve essere visualizzato lo stipendio più alto.
Se scrivi 1, 2 output saranno così
Employeeid | Stipendio |
2002 | 65500 |
4001 | 60500 |
N Stipendio più alto utilizzando la parola chiave TOP
Lo scenario consiste nel calcolare lo stipendio più alto del dipendente N dalla tabella dei dipendenti. I passaggi sono i seguenti:
1. Il primo passo è cercare dalla tabella lo stipendio unico TOP dei dipendenti.
2. Il passaggio successivo consiste nel calcolare lo stipendio minimo tra tutti gli stipendi risultanti dal primo passaggio. A questo punto, otteniamo N lo stipendio più alto.
3. Dal risultato dei passaggi precedenti, identificare i dettagli del dipendente il cui stipendio è lo stipendio minimo.
Esempio 1:
SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));
L'istruzione SQL di cui sopra viene utilizzata per trovare i dettagli dei dipendenti con lo stipendio più alto.
Vediamo in breve la spiegazione dell'istruzione SQL precedente:
Considera N =4.
Ogni volta che una query SQL include una sottoquery, ricorda che la query interna verrà eseguita prima, quindi verrà eseguita la query esterna.
Il seguente risultato sarà generato dalla query "SELECT DISTINCT TOP N stipendio da dipendenti ORDER BY stipendio DESC", che genererà il seguente risultato.
Stipendio |
65500 |
60500 |
60000 |
58500 |
La successiva query esterna è:"SELECT MIN(stipendio) FROM dipendenti WHERE stipendio IN (l'output di una precedente query SQL.
Stipendio |
58500 |
Dal risultato di cui sopra, si verifica che il quarto stipendio più alto richiesto è 58500.
Infine, la query principale è SELECT * FROM dipendenti WHERE stipendio =output della precedente query SQL. L'output di questa query sarà il risultato dei dipendenti che hanno il quarto stipendio più alto.
FIRST_NAME | STIPENDIO |
DEEPAM | 58500 |
Esempio 2:
SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));
L'istruzione SQL di cui sopra viene utilizzata per trovare i dettagli dei dipendenti con lo stipendio più alto N.
Vediamo in breve la spiegazione dell'istruzione SQL precedente:
Considera N =5.
Ogni volta che una query SQL include una sottoquery, ricorda che la query interna verrà eseguita prima, quindi verrà eseguita la query esterna.
Il seguente risultato sarà generato dalla query "SELECT DISTINCT TOP N stipendio da dipendenti ORDER BY stipendio DESC", che genererà il seguente risultato.
Stipendio |
65500 |
60500 |
60000 |
58500 |
55500 |
La successiva query esterna è:"SELECT MIN(stipendio) FROM dipendenti WHERE stipendio IN (l'output di una precedente query SQL.
Stipendio |
55500 |
Dal risultato di cui sopra, si verifica che il quinto stipendio più alto richiesto è 55500.
Infine, la query principale è SELECT * FROM dipendenti WHERE stipendio =output della precedente query SQL. L'output di questa query sarà il risultato dei dipendenti che hanno il quinto stipendio più alto.
FIRST_NAME | STIPENDIO |
PRACHI | 55500 |
L'ennesimo stipendio più alto utilizzando la funzione Row_Num()
Esempio:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
- Per calcolare il terzo stipendio più alto, usa rownum <4
- Per calcolare il secondo stipendio più alto, usa rownum <3
Risultato:
MIN(stipendio |
60500 |
Vediamo come funziona la query:
Passaggio 1: La query include subquery significa query interna e query esterna. Sappiamo tutti che quando la sottoquery viene utilizzata nella query, la query interna viene prima eseguita
Innanzitutto, la query interna verrà eseguita, quindi le query esterne verranno eseguite in base all'output prodotto dalla query interna:
Query interna:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
Risultato della query interna:
Stipendio |
65500 |
60500 |
60000 |
58500 |
55500 |
54500 |
50500 |
50000 |
Poiché abbiamo utilizzato una parola chiave distinta nella query, lo stipendio duplicato verrà eliminato. Lo stipendio unico verrà visualizzato come risultato della query interna.
Passaggio 2: Poiché il server ha terminato con una query interna, stiamo eseguendo la query esterna della query nidificata nell'output che abbiamo ottenuto dalla query interna
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
SELECT MIN(stipendio) DA (output della query interna):seleziona lo stipendio minimo dall'output della query interna, che è 50000 e 50000 non è il secondo stipendio più alto, a causa del quale abbiamo utilizzato rownum <3, che darà il numero di righe dall'alto che è inferiore a 3 significa solo 2.
L'output di WHERE rownum <3:
Stipendio |
65500 |
60500 |
Passaggio 3: L'ultima parte della query, che è SELECT MIN(stipendio) da (l'output di WHERE rownum<3):
L'output finale della query:
Stipendio |
60500 |
60500 è il secondo stipendio più alto sul tavolo dei dipendenti.
Nesimo stipendio più alto utilizzando la funzione Rank Rank ()
Esempio:
SELECT * FROM(SELECT First_Name, salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =#
- Per calcolare il terzo stipendio più alto, usa num =3
- Per calcolare il secondo stipendio più alto, usa num =2
Andremo per num =2.
L'output finale:
Nome | Stipendio | Classifica |
Rajesh | 60500 | 2 |
O output della query interna:
SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees
La funzione Dense_rank() calcola il Rank di ogni riga in un gruppo di righe in ordine crescente e restituisce il Rank come numero. Il grado parte da 1 e così via.
Nel caso in cui due o più file abbiano lo stesso stipendio, assegna un rango uguale a tutte le file.
Risultato della query interna:
Nome | Stipendio | Classifica |
VAIBHAVI | 65500 | 1 |
BHAVESH | 65500 | 1 |
RAJESH | 60500 | 2 |
VAIBHAV | 60000 | 3 |
RUCHIKA | 60000 | 3 |
DEEPAM | 58500 | 4 |
PRACHI | 55500 | 5 |
PRANOTI | 55500 | 5 |
ARCHIT | 55500 | 5 |
ASHWINI | 54500 | 6 |
NICHIL | 50500 | 7 |
ANUJA | 50500 | 7 |
RUCHIKA | 50000 | 8 |
Nell'output, possiamo vedere la stessa classifica per duplicare lo stipendio.
Passaggio 2: Poiché il server ha terminato con una query interna, stiamo eseguendo la query esterna della query nidificata nell'output che abbiamo ottenuto dalla query interna
SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = #
Seleziona * da selezionerà tutte le righe che non sono il secondo stipendio più alto perché abbiamo utilizzato RankRank dove num =2 darà righe corrispondenti in base al valore inserito dall'utente per num.
Poiché abbiamo usato num =2, l'output sarà
Nome | Stipendio | Classifica |
RAJESH | 60500 | 2 |
- Per trovare il terzo stipendio impostare num =3,
- Per trovare il quarto stipendio impostare num =4, e così via.