Diese Abfrage wird im Grunde sagen:
for each row in employee assign to e1
count = 0
for each row in employee assign to e2
if e1.salary <= e2.salary
count = count + 1
end if
end for
if count = 3
add e1 to result set
end if
end for
return result set
Zusammengefasst für jede Zeile in der Tabelle employee es die Tabelle ein zweites Mal besucht und die Anzahl der Zeilen mit einem niedrigeren oder gleich Gehalt zu zählen. Wenn es genau 3 gibt, wird die Zeile zum Ergebnis hinzugefügt.
Es ist erwähnenswert, dass dies schief gehen kann, wenn es mehr als einen Angestellten mit dem gleichen Gehalt gibt. Was Sie wahrscheinlich wollen, ist eine Abfrage mit einer Ranking-Funktion. So etwas wie dieses:
SELECT salary
FROM
(SELECT
salary
,DENSE_RANK() OVER (ORDER BY salary DESC) [rank]
FROM employee) t
WHERE
[rank] = 3
Was genau ist mit "3rd Highest" gemeint ist vielleicht ein bisschen mehrdeutig. Wenn wir die Gehälter haben 8, 8, 6, 5 die oben wird 5. zurückkehren, wenn wir 6 wollen Sie müssen die DENSE_RANK ändern, wie dies ROW_NUMBER:
SELECT salary
FROM
(SELECT
salary
,ROW_NUMBER() OVER (ORDER BY salary DESC) [rank]
FROM employee) t
WHERE
[rank] = 3
Die DENSE_RANK Version oben auch von der Rückkehr mehr Zeilen leiden wenn es eine Krawatte für den dritten Platz gibt. Ob dies wünschenswert ist oder nicht, hängt davon ab, was genau benötigt wird, aber es ist möglich, dies durch eine Aggregatfunktion auf das Gehalt zu reduzieren.
SELECT MAX(salary)
FROM
(SELECT
salary
,DENSE_RANK() OVER (ORDER BY salary desc) [rank]
FROM employee) t
WHERE
[rank] = 3
Für jemanden auf einer sehr grundlegenden Ebene des Verständnisses; Warum ist das so kompliziert? Kannst du dies nicht mit RANK oder ROW_NUMBER in Kombination mit ORDER BY erreichen? Gibt es einen Erbenwert, wenn man es wie ein OP-Beispiel macht? –
@StianYttervik Ich würde raten, wer auch immer es geschrieben hat, weiß nicht RANK oder ROW_NUMBER existieren – Caleth
Okay, nahe Wähler. Der Teufel stimmt nicht mit euch allen? Das ist * Nirgendwo * eine Empfehlungsfrage. (Im Ernst, wo hast du das überhaupt hinbekommen?) Und die Frage ist klar genug, wie einige nette Antworten zeigen, die erklären, was die Abfrage tut. Ich würde sogar argumentieren, dass diese Frage nicht "grundlegend" ist; Es ist nicht unvernünftig, von dieser Abfrage verwirrt zu sein, wenn Sie noch SQL-Grundlagen verstehen. (Verdammt, selbst wenn du dich in SQL auskennst, könnte es eine Minute dauern, es zu starren, um es herauszufinden.) Wenn du für das Schließen stimmst, * finde zuerst einen guten Grund *. – jpmc26