Cara melakukannya adalah dengan fungsi Analytic Oracle. Skenario khusus Anda hanyalah varian dari solusi yang saya berikan di utas lain.
Jika Anda tertarik untuk hanya memilih gaji tertinggi kedua maka salah satu DENSE_RANK(), RANK() dan ROW_NUMBER() akan melakukan triknya:
SQL> select * from
2 ( select sal
3 , rank() over (order by sal desc) as rnk
4 from
5 ( select distinct sal
6 from emp )
7 )
8 where rnk = 2
9 /
SAL RNK
---------- ----------
3000 2
SQL>
Namun, jika Anda ingin memilih informasi tambahan, seperti nama karyawan dengan gaji tertinggi kedua, fungsi yang Anda pilih akan mempengaruhi hasil. Alasan utama untuk memilih satu di atas yang lain adalah apa yang terjadi ketika ada dasi.
Jika Anda menggunakan ROW_NUMBER() itu akan mengembalikan karyawan kedua yang diurutkan berdasarkan gaji:bagaimana jika ada dua karyawan yang mengikat untuk gaji tertinggi? Bagaimana jika ada dua karyawan yang mengikat untuk gaji tertinggi kedua? Sedangkan jika Anda menggunakan RANK() dan ada dua karyawan yang mengikat untuk gaji tertinggi pertama, akan ada tidak record dengan RANK =2.
Saya menyarankan DENSE_RANK() biasanya merupakan fungsi teraman untuk dipilih dalam kasus ini, tetapi itu benar-benar tergantung pada kebutuhan bisnis tertentu.