Database
 sql >> Datenbank >  >> RDS >> Database

N-höchstes Gehalt

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):

ist

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

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

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.