Die häufigste und wichtigste Frage, die in Interviews gestellt wird, ist, wie wir das N-höchste Gehalt in einer Tabelle finden können (2-höchstes Gehalt, 3-höchstes Gehalt oder N-thöchstes Gehalt), wobei N 2, 3, 4, 5 oder irgendetwas sein kann.
Jeder Programmierer weiß, dass der einfachste Weg, das n höchste Gehalt zu finden, die Verwendung von SQL (Structured Query Language) in einer Tabelle ist.
Immer wenn der Interviewer Ihnen eine Frage zum zweithöchsten Gehalt, zum vierthöchsten Gehalt usw. stellt, sollten wir zur Lösung dieser Frage einige wichtige Konzepte wie eine Unterabfrage, zu verwendende Funktionen wie row_num(), Rank Rank () kennen. usw.
In diesem Artikel erfahren Sie, wie Sie das höchste N-Gehalt ermitteln können.
Betrachten Sie die vorhandenen Tabellen mit den folgenden Einträgen:
Tabelle:Mitarbeiter
MITARBEITERID | FIRST_NAME | NACHNAME | GEHALT | STADT | ABTEILUNG | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65500 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60000 | NOIDA | C# | 5 |
1003 | NICHIL | VANI | 50500 | JAIPUR | FMW | 2 |
2001 | PRACHI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUSCHIKA | JAIN | 50000 | MUMBAI | C# | 5 |
3001 | PRANOTI | SCHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOLD | 60500 | MUMBAI | TESTEN | 4 |
4002 | ASHWINI | BAGHAT | 54500 | NOIDA | JAVA | 3 |
4003 | RUSCHIKA | AGARWAL | 60000 | DELHI | ORACLE | 1 |
5001 | ARCHIT | SHARMA | 55500 | DELHI | TESTEN | 4 |
N höchstes Gehalt unter Verwendung einer korrelierten Unterabfrage
Eine korrelierte Unterabfrage ist eine spezielle Art von Unterabfrage, bei der die Unterabfrage von der Hauptabfrage abhängt und für jede von der Hauptabfrage zurückgegebene Zeile ausgeführt wird.
Syntax:
SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Wobei N durch die Zahlen 23 oder 4 ersetzt werden kann.
Beispiel 1: Schreiben Sie eine Abfrage, um die 4 höchsten Gehälter zu finden:
SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Wobei N =4, N -1:4 -1 =3.
4 höchstes Gehalt aus der Tabelle
Ausgabe:
Mitarbeiter-ID | Gehalt |
3003 | 58500 |
Erklärung:
Das Schlüsselwort „distinct“ dient dazu, die doppelten Gehälter in der Tabelle zu behandeln. Um nach dem N höchsten Gehalt zu suchen, berücksichtigen wir nur nicht doppelte Gehälter. Das höchste Gehalt bedeutet, dass kein Gehalt höher ist als es. Das zweithöchste Gehalt bedeutet, dass nur ein Gehalt höher ist. Das dritthöchste Gehalt bedeutet, dass nur zwei Gehälter höher sind als das dritte Gehalt, ähnlich bedeutet das N-höchste Gehalt, dass N-1 Gehälter höher sind.
Das vierthöchste Gehalt beträgt 58500 der Mitarbeiter-ID 3003.
Beispiel 2:Schreiben Sie eine Abfrage, um die 3 höchsten Gehälter zu finden:
SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Wobei N =3, N -1:3 -1 =2.
Zweithöchstes Gehalt aus der Tabelle
Ausgabe:
Mitarbeiter-ID | Gehalt |
1002 | 60000 |
4003 | 60000 |
Das zweithöchste Gehalt beträgt 58500 von zwei Mitarbeiter-ID 1002 und Mitarbeiter-ID 4003.
Beispiel 3:Schreiben Sie eine Abfrage, um die 5 höchsten Gehälter zu finden:
SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Wobei N =6, N -1:6 -1 =5.
5 höchstes Gehalt aus der Tabelle
Ausgabe:
Mitarbeiter-ID | Gehalt |
4002 | 54500 |
Das fünfthöchste Gehalt beträgt 54500 der Mitarbeiter-ID 4002.
N Höchstes Gehalt mit LIMIT-Schlüsselwort
Syntax:
SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;
Beispiel 1: Schreiben Sie eine Abfrage, um das zweithöchste Gehalt zu finden.
SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;
Ausgabe:
Mitarbeiter-ID | Gehalt |
2002 | 65500 |
Limit 1, 1 in der Abfrage sagt aus, wie hoch das höchste Gehalt angezeigt werden soll.
Wenn Sie 1 schreiben, sehen 2 Ausgaben so aus
Mitarbeiter-ID | Gehalt |
2002 | 65500 |
4001 | 60500 |
N Höchstes Gehalt unter Verwendung des TOP-Schlüsselworts
Das Szenario besteht darin, das N höchste Mitarbeitergehalt aus der Mitarbeitertabelle zu berechnen. Die Schritte sind wie folgt:
1. Der erste Schritt besteht darin, das eindeutige TOP-Gehalt der Mitarbeiter in der Tabelle zu suchen.
2. Der nächste Schritt besteht darin, das Mindestgehalt unter allen Gehältern zu berechnen, die sich aus dem ersten Schritt ergeben. Durch diesen Schritt erhalten wir N höchstes Gehalt.
3. Identifizieren Sie aus dem Ergebnis der obigen Schritte die Details des Mitarbeiters, dessen Gehalt das Mindestgehalt ist.
Beispiel 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 ));
Die obige SQL-Anweisung wird verwendet, um die Details der Mitarbeiter mit dem Nhöchsten Gehalt zu finden.
Sehen wir uns kurz die Erklärung der obigen SQL-Anweisung an:
Betrachten Sie N =4.
Immer wenn eine SQL-Abfrage eine Unterabfrage enthält, denken Sie daran, dass die innere Abfrage zuerst ausgeführt wird und dann die äußere Abfrage ausgeführt wird.
Das folgende Ergebnis wird durch die Abfrage „SELECT DISTINCT TOP N Salary from Employees ORDER BY Salary DESC“ generiert, die das folgende Ergebnis generiert.
Gehalt |
65500 |
60500 |
60000 |
58500 |
Die nächste äußere Abfrage lautet:„SELECT MIN(salary) FROM employee WHERE Salary IN (die Ausgabe einer vorherigen SQL-Abfrage.
Gehalt |
58500 |
Aus dem obigen Ergebnis wird bestätigt, dass das erforderliche vierthöchste Gehalt 58500 beträgt.
Schließlich ist die Hauptabfrage SELECT * FROM Mitarbeiter WHERE Gehalt =Ausgabe der vorherigen SQL-Abfrage. Die Ausgabe dieser Abfrage ist das Ergebnis der Mitarbeiter mit dem vierthöchsten Gehalt.
VORNAME | GEHALT |
DEEPAM | 58500 |
Beispiel 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 ));
Die obige SQL-Anweisung wird verwendet, um die Details der Mitarbeiter mit dem N höchsten Gehalt zu finden.
Sehen wir uns kurz die Erklärung der obigen SQL-Anweisung an:
Betrachten Sie N =5.
Immer wenn eine SQL-Abfrage eine Unterabfrage enthält, denken Sie daran, dass die innere Abfrage zuerst ausgeführt wird und dann die äußere Abfrage ausgeführt wird.
Das folgende Ergebnis wird durch die Abfrage „SELECT DISTINCT TOP N Salary from Employees ORDER BY Salary DESC“ generiert, die das folgende Ergebnis generiert.
Gehalt |
65500 |
60500 |
60000 |
58500 |
55500 |
Die nächste äußere Abfrage lautet:„SELECT MIN(salary) FROM employee WHERE Salary IN (die Ausgabe einer vorherigen SQL-Abfrage.
Gehalt |
55500 |
Aus dem obigen Ergebnis wird bestätigt, dass das erforderliche fünfthöchste Gehalt 55500 beträgt.
Schließlich ist die Hauptabfrage SELECT * FROM Mitarbeiter WHERE Gehalt =Ausgabe der vorherigen SQL-Abfrage. Die Ausgabe dieser Abfrage ist das Ergebnis der Mitarbeiter mit dem fünfthöchsten Gehalt.
VORNAME | GEHALT |
PRACHI | 55500 |
N-thöchstes Gehalt unter Verwendung der Row_Num()-Funktion
Beispiel:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
- Um das dritthöchste Gehalt zu berechnen, verwenden Sie rownum <4
- Um das zweithöchste Gehalt zu berechnen, verwenden Sie rownum <3
Ausgabe:
MIN(Gehalt |
60500 |
Mal sehen, wie die Abfrage funktioniert:
Schritt 1: Die Abfrage umfasst Unterabfrage bedeutet innere Abfrage und äußere Abfrage. Wir alle wissen, dass bei Verwendung der Unterabfrage in der Abfrage zuerst die innere Abfrage ausgeführt wird
Zuerst wird die innere Abfrage ausgeführt, dann werden die äußeren Abfragen basierend auf der Ausgabe der inneren Abfrage ausgeführt:
Innere Abfrage:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
Ausgabe der inneren Abfrage:
Gehalt |
65500 |
60500 |
60000 |
58500 |
55500 |
54500 |
50500 |
50000 |
Da wir in der Abfrage ein eindeutiges Schlüsselwort verwendet haben, wird das doppelte Gehalt eliminiert. Als Ergebnis der inneren Abfrage wird ein eindeutiges Gehalt angezeigt.
Schritt 2: Da der Server mit einer inneren Abfrage fertig ist, führen wir die äußere Abfrage der verschachtelten Abfrage in die Ausgabe aus, die wir von der inneren Abfrage erhalten haben
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
SELECT MIN(salary) FROM (innere Abfrageausgabe):Wählen Sie das Mindestgehalt aus der inneren Abfrageausgabe, das 50000 ist, und 50000 ist nicht das zweithöchste Gehalt, weshalb wir rownum <3 verwendet haben, was die Anzahl von ergibt Zeilen von oben, die weniger als 3 sind, bedeutet nur 2.
Die Ausgabe von WHERE rownum <3:
Gehalt |
65500 |
60500 |
Schritt 3: Der letzte Teil der Abfrage, der SELECT MIN(salary) from (die Ausgabe von WHERE rownum<3):
istDie endgültige Ausgabe der Abfrage:
Gehalt |
60500 |
60500 ist das zweithöchste Gehalt auf der Tabelle der Angestellten.
N-höchstes Gehalt unter Verwendung der Rank Rank ()-Funktion
Beispiel:
SELECT * FROM(SELECT First_Name, salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =#
- Um das dritthöchste Gehalt zu berechnen, verwenden Sie num =3
- Um das zweithöchste Gehalt zu berechnen, verwenden Sie num =2
Wir gehen für num =2.
Die endgültige Ausgabe:
Vorname | Gehalt | Rang |
Rajesh | 60500 | 2 |
O Ausgabe der inneren Abfrage:
SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees
Die Funktion Dense_rank() berechnet den Rang jeder Zeile in einer Ordnungsgruppe von Zeilen in aufsteigender Reihenfolge und gibt den Rang als Zahl zurück. Der Rang beginnt bei 1 und so weiter.
Falls zwei oder mehr als zwei Zeilen das gleiche Gehalt haben, weist es allen Zeilen den gleichen Rang zu.
Ausgabe der inneren Abfrage:
Vorname | Gehalt | 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 |
NICHIL | 50500 | 7 |
ANUJA | 50500 | 7 |
RUCHIKA | 50000 | 8 |
In der Ausgabe sehen wir dieselbe Rangfolge für doppeltes Gehalt.
Schritt 2: Da der Server mit einer inneren Abfrage fertig ist, führen wir die äußere Abfrage der verschachtelten Abfrage in die Ausgabe aus, die wir von der inneren Abfrage erhalten haben
SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = #
Select * from wählt alle Zeilen aus, die nicht das zweithöchste Gehalt sind, da wir RankRank verwendet haben, wobei num =2 übereinstimmende Zeilen gemäß dem vom Benutzer für num eingegebenen Wert ergibt.
Da wir num =2 verwendet haben, lautet die Ausgabe
Vorname | Gehalt | Rang |
RAJESH | 60500 | 2 |
- Um den dritten Gehaltssatz num =3 zu finden,
- Um das vierte Gehalt zu finden, setzen Sie num =4 und so weiter.