sql >> Database >  >> RDS >> Database

Nde hoogste salaris

De meest voorkomende en belangrijkste vraag die in interviews werd gesteld, is hoe we het N-de hoogste salaris in een tabel kunnen vinden (2 hoogste salaris, 3 hoogste salaris of N-de hoogste salaris), waarbij N 2, 3, 4, 5 of wat dan ook kan zijn.

Elke programmeur weet dat de eenvoudigste manier om het hoogste salaris te vinden, is door SQL (Structured Query Language) in een tabel te gebruiken.

Wanneer de interviewer u een vraag stelt over het 2 hoogste salaris, 4 hoogste salaris, enzovoort, moeten we, om deze vraag op te lossen, enkele belangrijke concepten kennen, zoals een subquery, functie die moet worden gebruikt zoals row_num(), Rank Rank () , enz.

In dit artikel vindt u verschillende manieren om het N Hoogste Salaris te vinden.

Beschouw de bestaande tabellen die de volgende records hebben:

Tabel:Werknemers

WERKNEMER-ID FIRST_NAME LAST_NAME SALARIS STAD AFDELING MANAGERID
1001 VAIBHAVI MISHRA 65500 PUNE ORAKLE 1
1002 VAIBHAV SHARMA 60000 NOIDA C# 5
1003 NIKHIL VANI 50500 JAIPUR FMW 2
2001 PRACHI SHARMA 55500 CHANDIGARH ORAKLE 1
2002 BHAVESH JAIN 65500 PUNE FMW 2
2003 RUCHIKA JAIN 50000 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 TESTEN 4
4002 ASHWINI BAGHAT 54500 NOIDA JAVA 3
4003 RUCHIKA AGARWAL 60000 DELHI ORAKLE 1
5001 ARCHIT SHARMA 55500 DELHI TESTEN 4

N hoogste salaris met behulp van een gecorreleerde subquery

Een gecorreleerde subquery is een speciaal type subquery, waarbij de subquery afhankelijk is van de hoofdquery en wordt uitgevoerd voor elke rij die wordt geretourneerd door de hoofdquery.

Syntaxis:

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

Waarbij N kan worden vervangen door nummers 23 of 4.

Voorbeeld 1: Schrijf een zoekopdracht om het 4 hoogste salaris te vinden:

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

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

4 hoogste salaris van de tafel

Uitvoer:

Werknemer Salaris
3003 58500

Uitleg:

Het onderscheidende sleutelwoord is er om de dubbele salarissen in de tabel aan te pakken. Om te zoeken naar het N hoogste salaris, kijken we alleen naar niet-dubbele salarissen. Het hoogste salaris betekent dat er geen salaris hoger is dan het. Het op één na hoogste salaris betekent dat slechts één salaris hoger is dan het. Het op twee na hoogste salaris betekent dat slechts twee salarissen hoger zijn dan het derde salaris, en op dezelfde manier betekent het N-hoogste salaris dat N-1 salarissen hoger zijn dan dat.

Het op drie na hoogste salaris is 58500 van werknemer-ID 3003.

Voorbeeld 2:Schrijf een zoekopdracht om de 3 hoogste salarissen te vinden:

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

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

2 hoogste salaris van de tafel

Uitvoer:

Werknemer Salaris
1002 60000
4003 60000

Het op één na hoogste salaris is 58500 van twee werknemer-ID 1002 en werknemer-ID 4003.

Voorbeeld 3:Schrijf een zoekopdracht om de 5 hoogste salarissen te vinden:

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

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

5 hoogste salaris van de tafel

Uitvoer:

Werknemer Salaris
4002 54500

Het vijfde hoogste salaris is 54500 van werknemer-ID 4002.

N Hoogste salaris met LIMIT-zoekwoord

Syntaxis:

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

Voorbeeld 1: Schrijf een zoekopdracht om het hoogste salaris van 2 te vinden.

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

Uitvoer:

Werknemer Salaris
2002 65500

Limiet 1, 1 in de zoekopdracht geeft aan hoeveel het hoogste salaris moet worden weergegeven.

Als u 1, 2 uitgangen schrijft, ziet dit er zo uit

Werknemer Salaris
2002 65500
4001 60500

N Hoogste salaris met TOP-zoekwoord

Het scenario is om het N hoogste werknemerssalaris te berekenen uit de werknemerstabel. De stappen zijn als volgt:

1. De eerste stap is om het unieke TOP-salaris van de werknemers uit de tabel te zoeken.
2. De volgende stap is het berekenen van het minimumloon van alle salarissen die uit de eerste stap voortvloeien. Door deze stap krijgen we N hoogste salaris.
3. Identificeer uit het resultaat van de bovenstaande stappen de details van de werknemer wiens salaris het minimumloon is.

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

Het bovenstaande SQL-statement wordt gebruikt om de details te vinden van de werknemers met het Nhoogste salaris.

Laten we de uitleg van de bovenstaande SQL-instructie in het kort bekijken:

Overweeg N =4.

Wanneer een SQL-query een subquery bevat, onthoud dan dat de inner query eerst wordt uitgevoerd en vervolgens de buitenste query.

Het volgende resultaat wordt gegenereerd door de zoekopdracht "SELECTEER DISTINCT TOP N salaris van werknemers ORDER BY salaris DESC", wat het volgende resultaat oplevert.

Salaris
65500
60500
60000
58500

De volgende buitenste query is:"SELECTEER MIN(salaris) FROM werknemers WHERE salaris IN (de uitvoer van een eerdere SQL-query.

Salaris
58500

Uit het bovenstaande resultaat blijkt dat het vereiste op drie na hoogste salaris 58500 is.

Ten slotte is de hoofdquery SELECT * FROM werknemers WHERE salaris =output van vorige SQL-query. De uitvoer van deze zoekopdracht is het resultaat van de werknemers met het op drie na hoogste salaris.

FIRST_NAME SALARIS
DEEPAM 58500

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

Het bovenstaande SQL-statement wordt gebruikt om de details te vinden van de werknemers met het hoogste salaris N.

Laten we de uitleg van de bovenstaande SQL-instructie in het kort bekijken:

Overweeg N =5.

Wanneer een SQL-query een subquery bevat, onthoud dan dat de inner query eerst wordt uitgevoerd en vervolgens de buitenste query.

Het volgende resultaat wordt gegenereerd door de zoekopdracht "SELECTEER DISTINCT TOP N salaris van werknemers ORDER BY salaris DESC", wat het volgende resultaat oplevert.

Salaris
65500
60500
60000
58500
55500

De volgende buitenste query is:"SELECTEER MIN(salaris) FROM werknemers WHERE salaris IN (de uitvoer van een eerdere SQL-query.

Salaris
55500

Uit het bovenstaande resultaat blijkt dat het vereiste op vier na hoogste salaris 55500 is.

Ten slotte is de hoofdquery SELECT * FROM werknemers WHERE salaris =output van vorige SQL-query. De uitvoer van deze zoekopdracht is het resultaat van de werknemers met het op vier na hoogste salaris.

FIRST_NAME SALARIS
PRACHI 55500

Ne Hoogste salaris met functie Row_Num()

Voorbeeld:

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;
  • Gebruik rownum <4
  • . om het op twee na hoogste salaris te berekenen
  • Gebruik rownum <3
  • . om het op één na hoogste salaris te berekenen

Uitvoer:

MIN(salaris .)
60500

Laten we eens kijken hoe de zoekopdracht werkt:

Stap 1: De query omvat subquery betekent innerlijke query en buitenste query. We weten allemaal dat wanneer de subquery in de query wordt gebruikt, de innerlijke query eerst wordt uitgevoerd

Eerst wordt de innerlijke query uitgevoerd en vervolgens worden de buitenste query's uitgevoerd op basis van de uitvoer die door de innerlijke query wordt geproduceerd:

Innerlijke vraag:

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

Uitvoer van de innerlijke vraag:

Salaris
65500
60500
60000
58500
55500
54500
50500
50000

Omdat we een duidelijk trefwoord in de zoekopdracht hebben gebruikt, wordt het dubbele salaris geëlimineerd. Het unieke salaris wordt weergegeven als het resultaat van de innerlijke vraag.

Stap 2: Omdat de server klaar is met een innerlijke query, voeren we de buitenste query van de geneste query uit in de uitvoer die we hebben verkregen uit de innerlijke query

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

SELECT MIN(salary) FROM (inner query output):selecteer minimum salaris uit de inner query output, dat is 50000 en 50000 is niet het op één na hoogste salaris, waardoor we rownum <3 hebben gebruikt, wat het aantal rijen vanaf de bovenkant die minder dan 3 is, betekent slechts 2.

De uitvoer van WHERE rownum <3:

Salaris
65500
60500

Stap 3: Het laatste deel van de query, dat is de SELECT MIN(salaris) van (de uitvoer van WHERE rownum<3):

De uiteindelijke uitvoer van de zoekopdracht:

Salaris
60500

60500 is het op één na hoogste salaris op de tafel van de werknemers.

Ne Hoogste salaris met behulp van de functie Rang Rang ()

Voorbeeld:

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

- Om het op twee na hoogste salaris te berekenen, gebruikt u num =3

- Om het op één na hoogste salaris te berekenen, gebruikt u num =2

We gaan voor num =2.

De uiteindelijke uitvoer:

Voornaam Salaris Rang
Rajesj 60500 2

O output van de innerlijke query:

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

De functie Dense_rank() berekent de Rang van elke rij in een volgordegroep van rijen in oplopende volgorde en retourneert de Rang als een getal. De Rang begint bij 1 enzovoort.

In het geval dat twee of meer dan twee rijen hetzelfde salaris hebben, kent het een gelijke rang toe aan alle rijen.

Uitvoer van de innerlijke vraag:

Voornaam Salaris Rang
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
NIKHIL 50500 7
ANUJA 50500 7
RUCHIKA 50000 8

In de output kunnen we dezelfde rangorde zien om het salaris te dupliceren.

Stap 2: Omdat de server klaar is met een innerlijke query, voeren we de buitenste query van de geneste query uit in de uitvoer die we hebben verkregen van de innerlijke query

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

Selecteer * van om alle rijen te selecteren die niet het op één na hoogste salaris zijn, omdat we Rangorde hebben gebruikt waarbij num =2 overeenkomende rijen geeft volgens de waarde die door de gebruiker is ingevoerd voor num.

Omdat we num =2 hebben gebruikt, is de uitvoer

Voornaam Salaris Rang
RAJESH 60500 2
  • Om de derde salarisset num =3 te vinden,
  • Om de vierde salarisset num =4 te vinden, enzovoort.


  1. PostgreSQL-equivalent van Oracle bulkcollect

  2. Oracle 12c Standard Edition installeren op Windows 10 Professional

  3. Oracle Sequence-waarden zijn niet geordend

  4. Hoe EXTRACT() werkt in MariaDB