Anda dapat menggunakan Common Table Expression (CTE) untuk mendapatkan jawabannya.
Katakanlah Anda memiliki gaji berikut dalam tabel Gaji:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Kami akan menggunakan:
DECLARE @N int
SET @N = 3 -- Change the value here to pick a different salary rank
SELECT Salary
FROM (
SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary
FROM Salaries
) as SalaryCTE
WHERE SalaryRank = @N
Ini akan membuat nomor baris untuk setiap baris setelah diurutkan berdasarkan Gaji dalam urutan menurun, lalu mengambil baris ketiga (yang berisi rekor tertinggi ketiga).
- Fiddle SQL
Bagi Anda yang tidak menginginkan CTE (atau terjebak dalam SQL 2000):
[Catatan :kinerjanya terasa lebih buruk daripada contoh di atas; menjalankannya secara berdampingan dengan rencana eksekusi menunjukkan biaya kueri sebesar 36% untuk CTE dan 64% untuk subkueri]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
di mana N didefinisikan oleh Anda.
SalarySubquery
adalah alias yang saya berikan ke subquery, atau kueri yang ada di dalam tanda kurung.
Apa yang dilakukan subquery adalah memilih gaji N teratas (kita akan mengatakan 3 dalam hal ini), dan memerintahkan mereka dengan gaji terbesar.
Jika kita ingin melihat gaji tertinggi ketiga, subquery akan kembali:
Salary
-----------
80,000
72,000
50,000
Kueri luar kemudian memilih gaji pertama dari subkueri, kecuali kali ini kami mengurutkannya secara menaik, yang diurutkan dari yang terkecil hingga terbesar, jadi 50.000 akan menjadi catatan pertama yang diurutkan secara menaik.
Seperti yang Anda lihat, 50.000 memang merupakan gaji tertinggi ketiga dalam contoh.