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