これを行う方法は、Oracleの分析関数を使用することです。あなたの特定のシナリオは、私が別のスレッドで提供したソリューションの単なる変形です。
2番目に高い給与を選択するだけの場合は、DENSE_RANK()、RANK()、ROW_NUMBER()のいずれかでうまくいきます。
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>
ただし、給与が2番目に高い従業員の名前などの追加情報を選択する場合は、選択した関数が結果に影響します。どちらかを選択する主な理由は、同点の場合に何が起こるかです。
ROW_NUMBER()を使用すると、給与順に並べられた2番目の従業員が返されます。2人の従業員が最高の給与を求めている場合はどうなりますか? 2番目に高い給料を求めて2人の従業員がいる場合はどうなりますか? RANK()を使用していて、2人の従業員が最初の最高の給与を求めている場合、はありません。 RANK=2のレコード。
これらの場合、DENSE_RANK()を選択するのが通常最も安全な関数であることをお勧めしますが、実際には特定のビジネス要件によって異なります。