Database
 sql >> Database >  >> RDS >> Database

L'ennesima paga più alta

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 =&num;

- 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 = &num;

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.