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 =#
- 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 = #
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.