sql >> Databasteknik >  >> RDS >> Database

N:e högsta lönen

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

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

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.


  1. Hur man ändrar konfigurationsinställningarna för Databas Mail i SQL Server (T-SQL)

  2. Databastjänster på AWS och Oracle Cloud Platform

  3. ORA-01653:det går inte att utöka tabellen med i tabellutrymmet ORA-06512

  4. Hur man övervakar MySQL-behållare med Prometheus - Implementering på fristående och Swarm::Del ett