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

Nth højeste løn

Det mest almindelige og vigtige spørgsmål stillet i interviews, hvordan vi kan finde den N. højeste løn i en tabel (2 højeste løn, 3 højeste løn eller N. højeste løn), hvor N kunne være 2, 3, 4, 5 eller noget som helst.

Hver programmør ved, at den nemmeste måde at finde den højeste løn er at bruge SQL (Structured Query Language) i en tabel.

Når intervieweren stiller dig et spørgsmål om de 2 højeste løn, 4 højeste løn og så videre, for at løse dette spørgsmål, bør vi vide om nogle vigtige begreber som en underforespørgsel, funktion, der skal bruges som row_num(), Rank Rank () osv.

Denne artikel vil fortælle dig forskellige måder at finde den N højeste løn på.

Overvej de eksisterende tabeller, som har følgende poster:

Tabel:Medarbejdere

EMPLOYEEID FIRST_NAME LAST_NAME LØN BY AFDELING MANAGERID
1001 VAIBHAVI MISHRA 65500 PUNE ORACLE 1
1002 VAIBHAV SHARMA 60.000 NOIDA C# 5
1003 NIKHIL VANI 50500 JAIPUR FMW 2
2001 PRACHI SHARMA 55500 CHANDIGARH ORACLE 1
2002 BHAVESH JAIN 65500 PUNE FMW 2
2003 RUCHIKA JAIN 50.000 MUMBAI C# 5
3001 PRANOTI SHENDE 55500 PUNE JAVA 3
3002 ANUJA WANRE 50500 JAIPUR FMW 2
3003 DEEPAM JAUHARI 58500 MUMBAI JAVA 3
4001 RAJESH GOUD 60500 MUMBAI TEST 4
4002 ASHWINI BAGHAT 54500 NOIDA JAVA 3
4003 RUCHIKA AGARWAL 60.000 DELHI ORACLE 1
5001 ARCHIT SHARMA 55500 DELHI TEST 4

N højeste løn ved hjælp af en korreleret underforespørgsel

En korreleret underforespørgsel er en speciel type underforespørgsel, hvor underforespørgslen afhænger af hovedforespørgslen og udføres for hver række, der returneres af hovedforespørgslen.

Syntaks:

SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Hvor N kan erstattes med tallene 23 eller 4.

Eksempel 1: Skriv en forespørgsel for at finde de 4 højeste løn:

SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Hvor N =4, N-1:4-1 =3.

4 højeste løn fra bordet

Output:

Medarbejder Løn
3003 58500

Forklaring:

Det distinkte nøgleord er der for at håndtere de duplikerede lønninger i tabellen. For at søge efter den N højeste løn, tager vi kun hensyn til ikke-duplikerede lønninger. Den højeste løn betyder, at ingen løn er højere end den. Den næsthøjeste løn betyder, at kun én løn er større end den. Den tredje højeste løn betyder, at kun to lønninger er højere end den tredje løn, på samme måde betyder N. højeste løn, at N-1 lønninger er større end den.

Den fjerde højeste løn er 58500 af medarbejder-id 3003.

Eksempel 2:Skriv en forespørgsel for at finde de 3 højeste lønninger:

SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Hvor N =3, N -1:3 -1 =2.

2 højeste løn fra bordet

Output:

Medarbejder Løn
1002 60.000
4003 60.000

Den næsthøjeste løn er 58500 af to medarbejdere id 1002 og medarbejder id 4003.

Eksempel 3:Skriv en forespørgsel for at finde de 5 højeste lønninger:

SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Hvor N =6, N-1:6-1 =5.

5 højeste løn fra bordet

Output:

Medarbejder Løn
4002 54500

Den femte højeste løn er 54500 af medarbejder-id 4002.

N Højeste løn ved hjælp af LIMIT søgeord

Syntaks:

SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;

Eksempel 1: Skriv en forespørgsel for at finde 2 højeste løn.

SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;

Output:

Medarbejder Løn
2002 65500

Grænse 1, 1 i forespørgslen siger, hvor meget den højeste løn skal vises.

Hvis du skriver 1, vil 2 udgange være sådan her

Medarbejder Løn
2002 65500
4001 60500

N Højeste løn ved brug af TOP søgeord

Scenariet er at beregne den N højeste medarbejderløn fra medarbejdernes tabel. Trinnene er som følger:

1. Første skridt er at søge medarbejdernes TOP unikke løn fra tabellen.
2. Det næste trin er at beregne minimumslønnen blandt alle de lønninger, der følger af det første trin. Ved dette trin får vi N højeste løn.
3. Ud fra resultatet af ovenstående trin skal du identificere detaljerne om den medarbejder, hvis løn er minimumslønnen.

Eksempel 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 ));

Ovenstående SQL-sætning bruges til at finde detaljerne om de ansatte med den højeste løn.

Lad os se forklaringen af ​​ovenstående SQL-sætning kort:

Overvej N =4.

Når en SQL-forespørgsel indeholder en underforespørgsel, skal du huske, at den indre forespørgsel udføres først, derefter udføres den ydre forespørgsel.

Følgende resultat vil blive genereret af forespørgslen "SELECT DISTINCT TOP N løn fra medarbejdere ORDER BY salary DESC," som vil generere følgende resultat.

Løn
65500
60500
60.000
58500

Den næste ydre forespørgsel er:"VÆLG MIN(løn) FRA medarbejdere WHERE løn IN (outputtet af en tidligere SQL-forespørgsel.

Løn
58500

Ud fra ovenstående resultat bekræftes det, at den krævede fjerdehøjeste løn er 58500.

Til sidst er hovedforespørgslen VÆLG * FRA medarbejdere HVOR løn =output af tidligere SQL-forespørgsel. Outputtet af denne forespørgsel vil være resultatet af, at medarbejderne har den fjerde højeste løn.

FIRST_NAME LØN
DEEPAM 58500

Eksempel 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 ));

Ovenstående SQL-sætning bruges til at finde detaljerne om de ansatte med N højeste løn.

Lad os se forklaringen af ​​ovenstående SQL-sætning kort:

Overvej N =5.

Når en SQL-forespørgsel indeholder en underforespørgsel, skal du huske, at den indre forespørgsel udføres først, derefter udføres den ydre forespørgsel.

Følgende resultat vil blive genereret af forespørgslen "SELECT DISTINCT TOP N løn fra medarbejdere ORDER BY salary DESC," som vil generere følgende resultat.

Løn
65500
60500
60.000
58500
55500

Den næste ydre forespørgsel er:"VÆLG MIN(løn) FRA medarbejdere WHERE løn IN (outputtet af en tidligere SQL-forespørgsel.

Løn
55500

Ud fra ovenstående resultat bekræftes det, at den krævede femte højeste løn er 55500.

Til sidst er hovedforespørgslen VÆLG * FRA medarbejdere HVOR løn =output af tidligere SQL-forespørgsel. Outputtet af denne forespørgsel vil være resultatet af, at medarbejderne har den femte højeste løn.

FIRST_NAME LØN
PRACHI 55500

N. højeste løn ved hjælp af Row_Num()-funktionen

Eksempel:

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;
  • For at beregne den tredje højeste løn skal du bruge rownum <4
  • For at beregne den næsthøjeste løn skal du bruge rownum <3

Output:

MIN(løn
60500

Lad os se, hvordan forespørgslen fungerer:

Trin 1: Forespørgslen inkluderer underforespørgsel betyder indre forespørgsel og ydre forespørgsel. Vi ved alle, når underforespørgslen bruges i forespørgslen, udføres den indre forespørgsel først

Først vil den indre forespørgsel blive eksekveret, derefter udføres de ydre forespørgsler baseret på outputtet produceret af den indre forespørgsel:

Indre forespørgsel:

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

Output af den indre forespørgsel:

Løn
65500
60500
60.000
58500
55500
54500
50500
50.000

Da vi brugte et særskilt søgeord i forespørgslen, vil duplikatlønnen blive elimineret. Unik løn vil blive vist som resultatet af den indre forespørgsel.

Trin 2: Da serveren er færdig med en indre forespørgsel, udfører vi den ydre forespørgsel af den indlejrede forespørgsel i det output, vi fik fra den indre forespørgsel

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

VÆLG MIN(løn) FRA (indre forespørgselsoutput):vælg minimumsløn fra den indre forespørgselsoutput, som er 50.000 og 50.000 er ikke den næsthøjeste løn, hvorfor vi har brugt rownum <3, hvilket vil give antallet af rækker fra toppen, som er mindre end 3, betyder kun 2.

Outputtet af WHERE rownum <3:

Løn
65500
60500

Trin 3: Den sidste del af forespørgslen, som er SELECT MIN(løn) fra (outputtet af WHERE rækkenummer<3):

Det endelige output af forespørgslen:

Løn
60500

60500 er den næsthøjeste løn på medarbejdernes bord.

N. Højeste løn ved hjælp af funktionen Rank Rank ()

Eksempel:

SELECT * FROM(SELECT First_Name, salary, dense_rank()      OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =&num;

- For at beregne den tredje højeste løn skal du bruge num =3

- For at beregne den næsthøjeste løn skal du bruge num =2

Vi vil gå efter num =2.

Det endelige output:

Fornavn Løn Rang
Rajesh 60500 2

O output af den indre forespørgsel:

SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees

Funktionen Dense_rank() beregner rangeringen af ​​hver række i en rækkefølgegruppe af rækker i stigende rækkefølge og returnerer rangeringen som et tal. Rangeringen starter fra 1 og så videre.

I tilfælde af at to eller mere end to rækker har samme løn, tildeler den en lige rang til alle rækkerne.

Output af den indre forespørgsel:

Fornavn Løn Rang
VAIBHAVI 65500 1
BHAVESH 65500 1
RAJESH 60500 2
VAIBHAV 60.000 3
RUCHIKA 60.000 3
DEEPAM 58500 4
PRACHI 55500 5
PRANOTI 55500 5
ARCHIT 55500 5
ASHWINI 54500 6
NIKHIL 50500 7
ANUJA 50500 7
RUCHIKA 50.000 8

I outputtet kan vi se den samme rangering for at duplikere løn.

Trin 2: Da serveren er færdig med en indre forespørgsel, udfører vi den ydre forespørgsel af den indlejrede forespørgsel i det output, vi fik fra den indre forespørgsel

SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = &num;

Vælg * fra vil vælge alle de rækker, som ikke er den næsthøjeste løn, fordi vi har brugt RankRank, hvor num =2 vil give matchende rækker i henhold til den værdi, brugeren har indtastet for num.

Da vi brugte num =2, vil outputtet være

Fornavn Løn Rang
RAJESH 60500 2
  • For at finde det tredje lønsæt num =3,
  • For at finde det fjerde lønsæt num =4, og så videre.


  1. Guide til designdatabase til nyhedsbrev i MySQL

  2. SQL Server-fejl ved opdateringskommando - Der opstod en alvorlig fejl på den aktuelle kommando

  3. T-SQL-lagret procedure, der accepterer flere Id-værdier

  4. 5 Fejl i databasedesign, der skal undgås