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

N番目に高い給与

    インタビューで尋ねられた最も一般的で重要な質問は、テーブルでN番目に高い給与(2番目に高い給与、3番目に高い給与、またはN番目に高い給与)を見つける方法です。ここで、Nは2、3、4、5などです。

    各プログラマーは、テーブルでSQL(Structured Query Language)を使用するのが最も高い給与を見つける最も簡単な方法を知っています。

    インタビュアーが2つの最高給与、4つの最高給与などについて質問するときはいつでも、この質問を解決するために、サブクエリ、row_num()、Rank Rank()のように使用される関数などのいくつかの重要な概念について知っておく必要があります。 、など。

    この記事では、N最高の給与を見つけるためのさまざまな方法を紹介します。

    次のレコードがある既存のテーブルについて考えてみます。

    表:従業員

    EMPLOYEEID FIRST_NAME LAST_NAME 給与 CITY 部門 MANAGERID
    1001 VAIBHAVI MISHRA 65500 PUNE ORACLE 1
    1002 VAIBHAV シャルマ 60000 NOIDA C# 5
    1003 NIKHIL VANI 50500 ジャイプール FMW 2
    2001 PRACHI シャルマ 55500 チャンディーガル ORACLE 1
    2002 BHAVESH JAIN 65500 PUNE FMW 2
    2003 ルチカ JAIN 50000 ムンバイ C# 5
    3001 PRANOTI SHENDE 55500 PUNE JAVA 3
    3002 ANUJA WANRE 50500 ジャイプール FMW 2
    3003 DEEPAM ジャウハリ 58500 ムンバイ JAVA 3
    4001 RAJESH GOUD 60500 ムンバイ テスト 4
    4002 ASHWINI バガット 54500 NOIDA JAVA 3
    4003 ルチカ AGARWAL 60000 デリー ORACLE 1
    5001 ARCHIT シャルマ 55500 デリー テスト 4

    相関サブクエリを使用したNの最高給与

    相関サブクエリは特殊なタイプのサブクエリであり、サブクエリはメインクエリに依存し、メインクエリによって返されるすべての行に対して実行されます。

    構文:

    SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

    ここで、Nは23または4の数字に置き換えることができます。

    例1: 最高の4つの給与を見つけるためのクエリを作成します。

    SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

    ここで、N =4、N -1:4-1=3。

    テーブルからの4つの最高の給与

    出力:

    従業員ID 給与
    3003 58500

    説明:

    明確なキーワードは、テーブル内の重複した給与を処理するためにあります。 N個の最高給与を検索するために、重複しない給与のみを考慮します。最高の給料は、それより高い給料がないことを意味します。 2番目に高い給与は、1つの給与だけがそれよりも高いことを意味します。 3番目に高い給与は、2つの給与だけが3番目の給与よりも高いことを意味します。同様に、N番目に高い給与は、N-1の給与がそれよりも高いことを意味します。

    4番目に高い給与は従業員ID3003の58500です。

    例2:最高の3つの給与を見つけるためのクエリを作成します:

    SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

    ここで、N =3、N -1:3 -1=2です。

    テーブルからの2つの最高の給与

    出力:

    従業員ID 給与
    1002 60000
    4003 60000

    2番目に高い給与は2人の従業員ID1002と従業員ID4003の58500です。

    例3:5つの最高給与を見つけるためのクエリを作成します:

    SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

    ここで、N =6、N -1:6-1=5。

    テーブルからの5つの最高給与

    出力:

    従業員ID 給与
    4002 54500

    5番目に高い給与は従業員ID4002の54500です。

    NLIMITキーワードを使用した最高の給与

    構文:

    SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;

    例1: 最高の給与を2つ見つけるためのクエリを作成します。

    SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;

    出力:

    従業員ID 給与
    2002 65500

    クエリの制限1、1は、最高の給与が表示される金額を示しています。

    1、2の出力を書くと、次のようになります

    従業員ID 給与
    2002 65500
    4001 60500

    NTOPキーワードを使用した最高の給与

    シナリオは、従業員のテーブルからN人の最高の従業員の給与を計算することです。 手順は次のとおりです。

    1。 最初のステップは、テーブルから従業員のTOP固有の給与を検索することです。
    2。 次のステップは、最初のステップで得られたすべての給与の中で最低賃金を計算することです。このステップで、N個の最高給与を取得します。
    3。 上記の手順の結果から、給与が最低賃金である従業員の詳細を特定します。

    例1:

    SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));

    上記のSQLステートメントは、給与が最も高い従業員の詳細を見つけるために使用されます。

    上記のSQLステートメントの説明を簡単に見てみましょう:

    N=4と考えてください。

    SQLクエリにサブクエリが含まれている場合は常に、内側のクエリが最初に実行され、次に外側のクエリが実行されることに注意してください。

    次の結果は、クエリ「SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC」によって生成され、次の結果が生成されます。

    給与
    65500
    60500
    60000
    58500

    次の外部クエリは次のとおりです。"SELECTMIN(salary)FROM employees WHERE salary IN(前のSQLクエリの出力。

    給与
    58500

    上記の結果から、必要な4番目に高い給与は58500であることが確認されます。

    最後に、メインクエリはSELECT * FROM employees WHEREsalary=前のSQLクエリの出力です。このクエリの出力は、4番目に高い給与を持つ従業員の結果になります。

    FIRST_NAME 給与
    DEEPAM 58500

    例2:

    SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));

    上記のSQLステートメントは、給与が最も高いN人の従業員の詳細を見つけるために使用されます。

    上記のSQLステートメントの説明を簡単に見てみましょう:

    N=5と考えてください。

    SQLクエリにサブクエリが含まれている場合は常に、内側のクエリが最初に実行され、次に外側のクエリが実行されることに注意してください。

    次の結果は、クエリ「SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC」によって生成され、次の結果が生成されます。

    給与
    65500
    60500
    60000
    58500
    55500

    次の外部クエリは次のとおりです。"SELECTMIN(salary)FROM employees WHERE salary IN(前のSQLクエリの出力。

    給与
    55500

    上記の結果から、必要な5番目に高い給与は55500であることが確認されます。

    最後に、メインクエリはSELECT * FROM employees WHEREsalary=前のSQLクエリの出力です。このクエリの出力は、給与が5番目に高い従業員の結果になります。

    FIRST_NAME 給与
    PRACHI 55500

    Row_Num()関数を使用したN番目に高い給与

    例:

    SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;
    • 3番目に高い給与を計算するには、rownum <4
    • を使用します。
    • 2番目に高い給与を計算するには、rownum <3
    • を使用します。

    出力:

    MIN(salary
    60500

    クエリがどのように機能するか見てみましょう:

    ステップ1: クエリには、内部クエリと外部クエリを意味するサブクエリが含まれます。サブクエリがクエリで使用されるとき、内部クエリが最初に実行されることは誰もが知っています

    最初に内部クエリが実行され、次に内部クエリによって生成された出力に基づいて外部クエリが実行されます。

    内部クエリ:

    SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

    内部クエリの出力:

    給与
    65500
    60500
    60000
    58500
    55500
    54500
    50500
    50000

    クエリで個別のキーワードを使用したため、重複する給与は削除されます。内部クエリの結果として、固有の給与が表示されます。

    ステップ2: サーバーは内部クエリで実行されるため、ネストされたクエリの外部クエリを、内部クエリから取得した出力に実行しています

    SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

    SELECT MIN(salary)FROM(内部クエリ出力):内部クエリ出力から最低給与を選択します。これは50000であり、50000は2番目に高い給与ではありません。そのため、rownum <3を使用しました。これにより、上から3未満の行は、2つだけを意味します。

    WHERE rownum <3:

    の出力
    給与
    65500
    60500

    ステップ3: クエリの最後の部分であるSELECTMIN(salary)from(WHERE rownum <3の出力):

    クエリの最終出力:

    給与
    60500

    60500は、従業員のテーブルで2番目に高い給与です。

    ランクランク()関数を使用したN番目に高い給与

    例:

    SELECT * FROM(SELECT First_Name, salary, dense_rank()      OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =&num;

    -3番目に高い給与を計算するには、num=3を使用します

    -2番目に高い給与を計算するには、num =2

    を使用します。

    num=2になります。

    最終出力:

    First_Name 給与 ランク
    Rajesh 60500 2

    O 内部クエリの出力:

    SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees

    Dense_rank()関数は、行の順序グループ​​内の各行のランクを昇順で計算し、ランクを数値として返します。ランクは1から始まります。

    2つ以上の行の給与が同じ場合は、すべての行に同じランクが割り当てられます。

    内部クエリの出力:

    First_name 給与 ランク
    VAIBHAVI 65500 1
    BHAVESH 65500 1
    RAJESH 60500 2
    VAIBHAV 60000 3
    RUCHIKA 60000 3
    DEEPAM 58500 4
    PRACHI 55500 5
    PRANOTI 55500 5
    ARCHIT 55500 5
    ASHWINI 54500 6
    NIKHIL 50500 7
    ANUJA 50500 7
    RUCHIKA 50000 8

    出力では、給与を複製するための同じランキングを確認できます。

    ステップ2: サーバーは内部クエリで実行されるため、ネストされたクエリの外部クエリを、内部クエリから取得した出力に実行しています

    SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = &num;

    Select * fromは、RankRankを使用したため、2番目に高い給与ではないすべての行を選択します。num=2は、ユーザーがnumに入力した値に従って一致する行を提供します。

    num =2を使用したため、出力は

    になります。
    First_name 給与 ランク
    RAJESH 60500 2
    • 3番目の給与セットnum=3を見つけるには
    • 4番目の給与セットnum=4を見つけるにはなど。


    1. ヘアサロンデータベースプロジェクト

    2. Integrated Security=TrueとIntegratedSecurity=SSPIの違いは何ですか?

    3. SQLServerでgroup_concatを使用してクエリを実行する方法

    4. SQL ServerFORXMLパ​​スは繰り返しノードを作成します