sql >> データベース >  >> RDS >> Oracle

データベースOracleで給与が2番目に高いレコードを選択するにはどうすればよいですか?

    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()をお勧めします。



    1. MySQLでは、なぜこのIFがfalseを返すのですか?

    2. 複数のINパラメータを持つストアドプロシージャ

    3. MySQLでテーブルをあるデータベースから別のデータベースに移動する

    4. PHPを使用してデータベース内にユーザーのパスワードを保存するための最も安全な方法は何ですか?