Wie finde third or nth
ich das maximale Gehalt aus dem Gehalt table(EmpID,EmpName,EmpSalary)
auf optimierte Weise?
sql
sql-server
sql-server-2008
Karan Gandhi
quelle
quelle
Antworten:
Verwenden Sie
ROW_NUMBER
(wenn Sie eine einzelne möchten) oderDENSE_RANK
(für alle zugehörigen Zeilen):quelle
EmpSalary
Spalte. Auch reduziert im Vergleich zu was? Der Vorteil desROW_NUMBER
Ansatzes ist, dass Sie verwenden können..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Sie können es also verwenden, um Gruppen abzurufen und trotzdem auf eine beliebige Spalte davon zuzugreifen.Zeilennummer :
Unterabfrage:
Top Keyword:
quelle
... WHERE (N-1) = (Subquery)...
funktioniert. Die Unterabfrage ist eine korrelierte Abfrage, da ihreWHERE
Klausel dieEmp1
Hauptabfrage verwendet. Die Unterabfrage wird jedes Mal ausgewertet, wenn die Hauptabfrage eine Zeile durchsucht. Wenn wir beispielsweise das drittgrößte Gehalt (N = 3) aus (800, 1000, 700, 750) ermitteln möchten, wäre die Unterabfrage für die 1. ZeileSELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0. Für das 4. Gehalt ist der Wert (750)... WHERE Emp2.Salary > 750
2 oder N. -1, daher wird diese Zeile zurückgegeben.Versuche dies
Für 3 können Sie einen beliebigen Wert ersetzen ...
quelle
Wenn Sie den Weg optimieren möchten, müssen Sie das
TOP
Schlüsselwort verwenden. Die Abfrage des n-ten maximalen und minimalen Gehalts lautet also wie folgt: Die Abfragen sehen jedoch in umgekehrter Reihenfolge schwierig aus, wenn Sie aggregierte Funktionsnamen verwenden:N maximales Gehalt:
zum Beispiel: 3 maximales Gehalt:
N Mindestgehalt:
zum Beispiel: 3 Mindestgehalt:
quelle
Zu einfach, wenn Sie die Unterabfrage verwenden!
Sie können hier einfach den n-ten Wert nach der LIMIT-Einschränkung ändern.
Hier in dieser Unterabfrage Wählen Sie EmpSalary aus der Mitarbeiterreihenfolge nach EmpSalary DESC Limit 3 aus. würde die Top 3 Gehälter der Mitarbeiter zurückgeben. Aus dem Ergebnis wählen wir das Mindestgehalt mit dem Befehl MIN aus, um das 3. TOP-Gehalt des Mitarbeiters zu erhalten.
quelle
Ersetzen Sie N durch Ihre maximale Anzahl
Erläuterung
Die obige Abfrage kann ziemlich verwirrend sein, wenn Sie so etwas noch nicht gesehen haben. Die innere Abfrage wird als korrelierte Unterabfrage bezeichnet, da die innere Abfrage (die Unterabfrage) einen Wert aus der äußeren Abfrage (in diesem Fall die Emp1-Tabelle) verwendet ) in der WHERE-Klausel.
Und Quelle
quelle
... WHERE (N-1) = (Subquery)...
funktioniert. Die Unterabfrage ist eine korrelierte Abfrage, da ihreWHERE
Klausel dieEmp1
Hauptabfrage verwendet. Die Unterabfrage wird jedes Mal ausgewertet, wenn die Hauptabfrage eine Zeile durchsucht. Wenn wir beispielsweise das drittgrößte Gehalt (N = 3) aus (800, 1000, 700, 750) ermitteln möchten, wäre die Unterabfrage für die 1. ZeileSELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0. Für das 4. Gehalt ist der Wert (750)... WHERE Emp2.Salary > 750
2 oder N. -1, daher wird diese Zeile zurückgegeben.Drittes oder n-te maximales Gehalt aus der Gehaltstabelle ohne Unterabfrage
Für das dritthöchste Gehalt setzen Sie 2 anstelle von N-1
quelle
quelle
Beziehen Sie sich auf die folgende Abfrage, um das n-te höchste Gehalt zu erhalten. Auf diese Weise erhalten Sie das n-te höchste Gehalt in MYSQL. Wenn Sie nur das n-te niedrigste Gehalt erhalten möchten, müssen Sie DESC in der Abfrage durch ASC ersetzen.
quelle
quelle
Methode 1:
Methode 2:
quelle
Im Jahr 2008 können wir ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) verwenden, um einen Rang ohne Bindungen zu erhalten, die wir verwenden können.
Zum Beispiel können wir auf diese Weise die achthöchste erreichen oder @N in etwas anderes ändern oder es als Parameter in einer Funktion verwenden, wenn Sie möchten.
Wie Sie vielleicht wissen, wird dies in SQL Server 2012 mit LAG () intuitiver ausgeführt.
quelle
quelle
Dies ist eine der beliebtesten Fragen in jedem SQL-Interview. Ich werde verschiedene Abfragen aufschreiben, um den n-ten höchsten Wert einer Spalte herauszufinden.
Ich habe eine Tabelle mit dem Namen "Emloyee" erstellt, indem ich das folgende Skript ausgeführt habe.
Jetzt werde ich 8 Zeilen in diese Tabelle einfügen, indem ich die Anweisung insert ausführe.
Jetzt werden wir den dritthöchsten Basic_sal aus der obigen Tabelle mit verschiedenen Abfragen herausfinden. Ich habe die folgende Abfrage in Management Studio ausgeführt und unten ist das Ergebnis.
Wir können im obigen Bild sehen, dass das dritthöchste Grundgehalt 8500 betragen würde. Ich schreibe 3 verschiedene Arten, dasselbe zu tun. Wenn Sie alle drei unten genannten Abfragen ausführen, erhalten Sie das gleiche Ergebnis, dh 8500.
Erster Weg: - Verwenden der Zeilennummernfunktion
quelle
Ich zeige das dritthöchste Gehalt
quelle
quelle
- das höchste Gehalt
- (n-te -1) höchstes Gehalt
quelle
Optimierte Methode: Verwenden Sie anstelle der Unterabfrage nur limit.
Siehe Limit-Syntax hier http://www.mysqltutorial.org/mysql-limit.aspx
quelle
Um den dritthöchsten Wert aus der Tabelle zu erhalten
quelle
Durch Unterabfrage:
quelle
Versuchen Sie diese Abfrage
Setzen Sie n = den gewünschten Wert
quelle
quelle
MySQL-getestete Lösung, angenommen N = 4:
Ein anderes Beispiel:
quelle
Versuchen Sie diesen Code: -
quelle
Ersetzen Sie n durch das n-te höchste Gehalt als Zahl.
quelle
Probier diese...
quelle
Ändern Sie für das zweithöchste Gehalt 3 zu 2 in der obigen Abfrage und für das n-te höchste Gehalt in N, wobei N = 1,2,3,4 ....
quelle
SELECT * FROM (wählen Sie ein unterschiedliches Gehalt aus der Kundenbestellung nach Gehalt DESC) Limit 4,1;
Limit 4,1 bedeutet, dass Sie die ersten 4 Zeilen verlassen und dann die nächste auswählen.
Limit und Rownumber hängen von der verwendeten Plattform ab.
Versuchen Sie dies, es wird funktionieren.
quelle
HINWEIS: Bitte ersetzen Sie OFFSET 3 in Query durch eine beliebige n- te Ganzzahl
Beschreibung
Geben Sie nur 1 Zeile zurück
erste 3 Datensätze ausschließen Hier können Sie eine beliebige Ganzzahl eingeben
quelle
Unterabfragen brauchen immer mehr Zeit:
Verwenden Sie die folgende Abfrage, um die höchsten und niedrigsten Daten zu erhalten:
Höchste Daten:
select *from business order by id desc limit 3,1;
Niedrigste Daten:
select *from business order by id asc limit 3,1;
Kann N anstelle von 3 verwenden, um n-te Daten zu erhalten.
quelle