Jak znaleźć trzecią lub n-tą
maksymalną pensję z salary table(EmpID,EmpName,EmpSalary)
w zoptymalizowany sposób?
Użyj ROW_NUMBER
(jeśli chcesz pojedynczy) lub DENSE_RANK
(dla wszystkich powiązanych wierszy):
WITH CTE AS
(
SELECT EmpID, EmpName, EmpSalary,
RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow
Zastąpić N swoim numerem maksymalnym.
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Objaśnienie
Powyższe zapytanie może być dość mylące, jeśli nie widziałeś wcześniej czegoś takiego - zapytanie wewnętrzne jest tak zwanym podzapytaniem skorelowanym, ponieważ zapytanie wewnętrzne (podzapytanie) używa wartości z zapytania zewnętrznego (w tym przypadku tabeli Emp1) w klauzuli WHERE.
I Źródło