Den vanligaste och viktigaste frågan som ställdes i intervjuer är hur vi kan hitta den N:e högsta lönen i en tabell (2 högsta lön, 3 högsta lön eller N:e högsta lön), där N kan vara 2, 3, 4, 5 eller något.
Varje programmerare vet att det enklaste sättet att hitta den högsta lönen är att använda SQL (Structured Query Language) i en tabell.
Närhelst intervjuaren ställer en fråga till dig om de 2 högsta lönerna, 4 högsta lönerna, och så vidare, för att lösa denna fråga, bör vi känna till några viktiga begrepp som en underfråga, funktion som ska användas som row_num(), Rank Rank () , etc.
Den här artikeln kommer att berätta för dig om olika sätt att hitta den högsta lönen.
Tänk på de befintliga tabellerna som har följande poster:
Tabell:Anställda
ANSTÄLLDA ID | FIRST_NAME | LAST_NAME | LÖN | STAD | AVDELNING | 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 | TESTER | 4 |
4002 | ASHWINI | BAGHAT | 54500 | NOIDA | JAVA | 3 |
4003 | RUCHIKA | AGARWAL | 60 000 | DELHI | ORACLE | 1 |
5001 | ARCHIT | SHARMA | 55500 | DELHI | TESTER | 4 |
N högsta lön med en korrelerad underfråga
En korrelerad underfråga är en speciell typ av underfråga, där underfrågan beror på huvudfrågan och exekveras för varje rad som returneras av huvudfrågan.
Syntax:
SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Där N kan ersättas med nummer 23 eller 4.
Exempel 1: Skriv en fråga för att hitta de 4 högsta lönerna:
SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Där N =4, N-1:4-1 =3.
4 högsta lönen från bordet
Utdata:
Anställd | Lön |
3003 | 58500 |
Förklaring:
Det distinkta nyckelordet är till för att hantera de dubblerade lönerna i tabellen. För att söka efter den N högsta lönen tar vi bara hänsyn till icke-duplicerade löner. Den högsta lönen betyder att ingen lön är högre än den. Den näst högsta lönen betyder att bara en lön är högre än den. Den tredje högsta lönen betyder att endast två löner är högre än den tredje lönen, på samma sätt betyder N:e högsta lönen att N-1 löner är högre än den.
Den fjärde högsta lönen är 58500 av anställd id 3003.
Exempel 2:Skriv en fråga för att hitta de tre högsta lönerna:
SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Där N =3, N -1:3 -1 =2.
2 högsta lönen från bordet
Utdata:
Anställd | Lön |
1002 | 60 000 |
4003 | 60 000 |
Den näst högsta lönen är 58 500 av två anställda id 1002 och anställd id 4003.
Exempel 3:Skriv en fråga för att hitta de 5 högsta lönerna:
SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Där N =6, N -1:6 -1 =5.
5 högsta lönen från bordet
Utdata:
Anställd | Lön |
4002 | 54500 |
Den femte högsta lönen är 54500 av anställd id 4002.
N Högsta lön med LIMIT sökord
Syntax:
SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;
Exempel 1: Skriv en fråga för att hitta 2 högsta lönen.
SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;
Utdata:
Anställd | Lön |
2002 | 65500 |
Gräns 1, 1 i frågan säger hur mycket den högsta lönen ska visas.
Om du skriver 1 blir 2 utgångar så här
Anställd | Lön |
2002 | 65500 |
4001 | 60500 |
N Högsta lön med TOP-sökord
Scenariot är att beräkna den N högsta lönen från de anställdas tabell. Stegen är följande:
1. Första steget är att söka de anställdas TOP unika lön från tabellen.
2. Nästa steg är att beräkna minimilönen bland alla löner som följer av det första steget. Genom detta steg får vi N högsta lön.
3. Utifrån resultatet av stegen ovan, identifiera uppgifterna om den anställde vars lön är minimilönen.
Exempel 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 ));
Ovanstående SQL-sats används för att hitta detaljerna om de anställda med den högsta lönen.
Låt oss se förklaringen av ovanstående SQL-sats i korthet:
Betrakta N =4.
Närhelst en SQL-fråga innehåller en underfråga, kom ihåg att den inre frågan körs först och sedan körs den yttre frågan.
Följande resultat kommer att genereras av frågan "VÄLJ DISTINCT TOP N lön från anställda ORDER BY salaris DESC," som kommer att generera följande resultat.
Lön |
65500 |
60500 |
60 000 |
58500 |
Nästa yttre fråga är:"VÄLJ MIN(lön) FRÅN anställda WHERE lön IN (utdata från en tidigare SQL-fråga.
Lön |
58500 |
Från ovanstående resultat verifieras att den obligatoriska fjärde högsta lönen är 58500.
Slutligen är huvudfrågan VÄLJ * FRÅN anställda VAR lön =utdata från tidigare SQL-fråga. Resultatet av denna fråga kommer att vara resultatet av att de anställda har den fjärde högsta lönen.
FIRST_NAME | LÖN |
DEEPAM | 58500 |
Exempel 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 ));
Ovanstående SQL-sats används för att hitta detaljerna om de anställda med N högsta lön.
Låt oss se förklaringen av ovanstående SQL-sats i korthet:
Betrakta N =5.
Närhelst en SQL-fråga innehåller en underfråga, kom ihåg att den inre frågan körs först och sedan körs den yttre frågan.
Följande resultat kommer att genereras av frågan "VÄLJ DISTINCT TOP N lön från anställda ORDER BY salaris DESC," som kommer att generera följande resultat.
Lön |
65500 |
60500 |
60 000 |
58500 |
55500 |
Nästa yttre fråga är:"VÄLJ MIN(lön) FRÅN anställda WHERE lön IN (utdata från en tidigare SQL-fråga.
Lön |
55500 |
Från ovanstående resultat verifieras att den erforderliga femte högsta lönen är 55500.
Slutligen är huvudfrågan VÄLJ * FRÅN anställda VAR lön =utdata från tidigare SQL-fråga. Resultatet av denna fråga kommer att vara resultatet av att de anställda har den femte högsta lönen.
FIRST_NAME | LÖN |
PRACHI | 55500 |
N:te högsta lönen med Row_Num()-funktionen
Exempel:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
- För att beräkna den tredje högsta lönen, använd rownum <4
- För att beräkna den näst högsta lönen, använd rownum <3
Utdata:
MIN(lön |
60500 |
Låt oss se hur frågan fungerar:
Steg 1: Frågan inkluderar subquery betyder inre fråga och yttre fråga. Vi vet alla när underfrågan används i frågan, den inre frågan exekveras först
Först kommer den inre frågan att exekveras och sedan kommer de yttre frågorna att exekveras baserat på utdata som produceras av den inre frågan:
Inre fråga:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
Utdata från den inre frågan:
Lön |
65500 |
60500 |
60 000 |
58500 |
55500 |
54500 |
50500 |
50 000 |
Eftersom vi använde ett distinkt nyckelord i frågan, kommer dubblettlönen att elimineras. Unik lön kommer att visas som resultatet av den inre frågan.
Steg 2: Eftersom servern är klar med en inre fråga, exekverar vi den yttre frågan för den kapslade frågan i utdata som vi fick från den inre frågan
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
VÄLJ MIN(lön) FRÅN (inre frågeutgång):välj minimilön från den inre frågeutgången, som är 50 000 och 50 000 är inte den näst högsta lönen, på grund av vilket vi har använt rownum <3, vilket kommer att ge antalet rader från toppen som är mindre än 3 betyder bara 2.
Utdata från WHERE rownum <3:
Lön |
65500 |
60500 |
Steg 3: Den sista delen av frågan, som är SELECT MIN(lön) från (utdata från WHERE rownum<3):
Den slutliga utmatningen av frågan:
Lön |
60500 |
60500 är den näst högsta lönen på de anställdas bord.
N:e högsta lön med funktionen Rank Rank ()
Exempel:
SELECT * FROM(SELECT First_Name, salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =#
- För att beräkna den tredje högsta lönen, använd num =3
- För att beräkna den näst högsta lönen, använd num =2
Vi kommer att välja num =2.
Slutresultatet:
First_Name | Lön | Rang |
Rajesh | 60500 | 2 |
O utdata för den inre frågan:
SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees
Funktionen Dense_rank() beräknar Rank för varje rad i en ordningsgrupp av rader i stigande ordning och returnerar Rank som ett tal. Rangen börjar från 1 och så vidare.
Om två eller fler än två rader har samma lön, tilldelas alla rader lika rang.
Utdata från den inre frågan:
Förnamn | 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 utgången kan vi se samma rangordning för att duplicera lön.
Steg 2: Eftersom servern är klar med en inre fråga, exekverar vi den yttre frågan för den kapslade frågan till utdata som vi fick från den inre frågan
SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = #
Välj * från kommer att välja alla rader som inte är den näst högsta lönen eftersom vi har använt RankRank där num =2 ger matchande rader enligt värdet som användaren angett för num.
Eftersom vi använde num =2, blir utdata
Förnamn | Lön | Rang |
RAJESH | 60500 | 2 |
- För att hitta den tredje lönesatsen num =3,
- För att hitta den fjärde lönesatsen num =4, och så vidare.