インタビューで尋ねられた最も一般的で重要な質問は、テーブルで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 =#
-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 = #
Select * fromは、RankRankを使用したため、2番目に高い給与ではないすべての行を選択します。num=2は、ユーザーがnumに入力した値に従って一致する行を提供します。
num =2を使用したため、出力は
になります。First_name | 給与 | ランク |
RAJESH | 60500 | 2 |
- 3番目の給与セットnum=3を見つけるには
- 4番目の給与セットnum=4を見つけるにはなど。