RANKとDENSE_RANKはすでに提案されています。要件によっては、ROW_NUMBER()を検討することもできます。
select * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
RANK()、DENSE_RANK()、およびROW_NUMBER()の違いは、次のように要約されます。
- ROW_NUMBER()は常に一意のランキングを生成します。 ORDER BY句で2つの行を区別できない場合でも、(ランダムに)異なるランキングが与えられます
- RANK()とDENSE_RANK()は、ORDERBY句で区別できない行に同じランクを付けます
- DENSE_RANK()は常にランクの連続シーケンス(1,2,3、...)を生成しますが、RANK()は同じランクの2つ以上の行の後にギャップを残します(「オリンピック」と考えてください:if 2人のアスリートが金メダルを獲得しました。2位はなく、3位のみです)
したがって、従業員が1人だけ必要な場合(給与が2番目に高い従業員が複数いる場合でも)、ROW_NUMBER()をお勧めします。