To zapytanie jest w zasadzie mówiąc:
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
Podsumowując dla każdego wiersza w tabeli employee, do którego przybywa stole po raz drugi i liczenia liczby wierszy z niższej lub równej pensji. Jeśli są dokładnie 3, doda wiersz do wyniku.
Warto zauważyć, że może się to nie udać, jeśli jest więcej niż jeden pracownik o tym samym wynagrodzeniu. Prawdopodobnie potrzebujesz zapytania z funkcją rankingu. Coś takiego:
SELECT salary
FROM
(SELECT
salary
,DENSE_RANK() OVER (ORDER BY salary DESC) [rank]
FROM employee) t
WHERE
[rank] = 3
To, co dokładnie oznacza "3. najwyższy", jest być może trochę niejednoznaczne. Jeśli mamy pensje 8, 8, 6, 5 powyżej powróci 5. Jeśli chcieliśmy 6 trzeba byłoby zmienić DENSE_RANK do row_number tak:
SELECT salary
FROM
(SELECT
salary
,ROW_NUMBER() OVER (ORDER BY salary DESC) [rank]
FROM employee) t
WHERE
[rank] = 3
Wersja DENSE_RANK powyżej cierpi również z powrotem wiele wierszy jeśli jest remis na trzecie miejsce. To, czy jest to pożądane, czy też nie, zależy dokładnie od tego, co jest wymagane, ale można je obniżyć, używając funkcji agregującej na wynagrodzeniu.
SELECT MAX(salary)
FROM
(SELECT
salary
,DENSE_RANK() OVER (ORDER BY salary desc) [rank]
FROM employee) t
WHERE
[rank] = 3
Dla kogoś na bardzo podstawowym poziomie zrozumienia; dlaczego to tak skomplikowane? Nie możesz tego zrobić za pomocą RANK lub ROW_NUMBER w połączeniu z ORDER BY? Czy jest jakaś dziedziczona wartość, robiąc to jak przykład OP? –
@StianYttervik Zgaduję, że ktokolwiek to napisał, nie wie, że RANK lub ROW_NUMBER istnieją. – Caleth
OK, bliscy wyborcy. Do diabła z tobą wszystko jest nie tak? To jest * nigdzie blisko * pytania rekomendacyjnego. (Poważnie, skąd go wziąłeś?) Pytanie jest wystarczająco jasne, o czym świadczy kilka fajnych odpowiedzi wyjaśniających, co robi zapytanie. Powiedziałbym nawet, że to pytanie nie jest "podstawowe"; nie jest nierozsądne, że jest ono mylone z tym zapytaniem, gdy wciąż chwyta się podstaw SQL. (Heck, nawet jeśli znasz sposób, w jaki działa SQL, może to chwilę potrwać, zanim się zorientujesz.) Jeśli chcesz zagłosować, aby zamknąć, * najpierw wymyśl dobry powód *. – jpmc26