SQL 実装 LeetCode (185. 部門内で最も給与の高い上位 3 名)

SQL 実装 LeetCode (185. 部門内で最も給与の高い上位 3 名)

[LeetCode] 185. 部門別給与上位3位

従業員テーブルにはすべての従業員が保持されます。すべての従業員には ID があり、部門 ID の列もあります。

+----+-------+--------+--------------+
| ID | 名前 | 給与 | 部門 ID |
+----+-------+--------+--------------+
| 1 | ジョー | 70000 | 1 |
| 2 | ヘンリー | 80000 | 2 |
| 3 | サム | 60000 | 2 |
| 4 | 最大 | 90000 | 1 |
| 5 | ジャネット | 69000 | 1 |
| 6 | ランディ | 85000 | 1 |
+----+-------+--------+--------------+

部門テーブルには会社のすべての部門が保存されます。

+----+----------+
| ID | 名前 |
+----+----------+
| 1 | IT |
| 2 | 販売 |
+----+----------+

各部門で給与上位 3 位の従業員を検索する SQL クエリを作成します。上記のテーブルの場合、SQL クエリは次の行を返します。

+------------+----------+---------+
| 部門 | 従業員 | 給与 |
+------------+----------+---------+
| IT | 最大 | 90000 |
| IT | ランディ | 85000 |
| IT | ジョー | 70000 |
| 売上 | ヘンリー | 80000 |
| 販売 | サム | 60000 |
+------------+----------+---------+

この質問は、以前の「部門の最高給与」の質問の延長です。これは「難しい」とマークされており、かなり難しいです。これは、以前の多くの質問の知識ポイントを組み合わせたものです。まず、Select Count (Distinct) を使用する方法を見てみましょう。従業員と部門の 2 つのテーブルを結合し、現在の給与よりも高い給与が 2 つしかないことを確認します。次に、最も高い給与の上位 3 つを取得できます。以下のコードを参照してください。

解決策1:

SELECT d.Name AS Department、e.Name AS Employee、e.Salary FROM Employee e
e.DepartmentId = d.Id で Department d を結合します
WHERE (SELECT COUNT(DISTINCT Salary) FROM Employee WHERE Salary > e.Salary
AND DepartmentId = d.Id) < 3 ORDER BY d.Name, e.Salary DESC;

次のメソッドは、上記のメソッドの <3 を IN (0, 1, 2) に置き換え、同じ効果をもたらします。

解決策2:

SELECT d.Name AS Department, e.Name AS Employee, e.Salary FROM Employee e, Department d
WHERE (SELECT COUNT(DISTINCT Salary) FROM Employee WHERE Salary > e.Salary
AND DepartmentId = d.Id) IN (0, 1, 2) AND e.DepartmentId = d.Id ORDER BY d.Name, e.Salary DESC;

または、Group by Having Count(Distinct ..) キーワードを使用してこれを行うこともできます。

解決策3:

SELECT d.Name AS Department、e.Name AS Employee、e.Salary FROM 
(SELECT e1.Name, e1.Salary, e1.DepartmentId FROM Employee e1 JOIN Employee e2 
ON e1.DepartmentId = e2.DepartmentId AND e1.Salary <= e2.Salary GROUP BY e1.Id 
HAVING COUNT(DISTINCT e2.Salary) <= 3) e JOIN Department d ON e.DepartmentId = d.Id 
ORDER BY d.Name, e.Salary DESC;

次の方法は少し複雑で、変数を使用します。これは、連続した数字のソリューション 3 で使用した方法と同じです。目的は、給与レベルに応じて各人にランクを追加し、最終的にランク値が 3 以下の項目を返すことです。以下のコードを参照してください。

解決策4:

SELECT d.Name AS Department、e.Name AS Employee、e.Salary FROM 
(名前、給与、部門IDを選択、
@rank := IF(@pre_d = DepartmentId, @rank + (@pre_s <> Salary), 1) AS ランク、
@pre_d := 部門ID、@pre_s := 給与 
従業員から、(SELECT @pre_d := -1, @pre_s := -1, @rank := 1) AS init
ORDER BY DepartmentId, Salary DESC) e JOIN Department d ON e.DepartmentId = d.Id
e.rank <= 3 の場合、d.Name、e.Salary で条件を満たす必要があります。

類似トピック:

部門最高給与

2番目に高い給与

2つのテーブルを結合する

参考文献:

https://leetcode.com/discuss/23002/my-tidy-solution

https://leetcode.com/discuss/91087/yet-another-solution-using-having-count-distinct

https://leetcode.com/discuss/69880/two-solutions-1-count-join-2-three-variables-join

これで、LeetCode (185. 部門内で給与の高い上位 3 位) の SQL 実装に関するこの記事は終了です。SQL 実装に関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • LeetCode の SQL 実装 (196. 重複するメールボックスを削除する)
  • LeetCode の SQL 実装 (184. 部門内で最も高い給与)
  • LeetCode の SQL 実装 (183. 注文をしたことがない顧客)
  • LeetCode の SQL 実装 (182. 重複するメールボックス)
  • LeetCode の SQL 実装 (181. 従業員は管理職よりも収入が高い)
  • SQLはLeetCodeを実装します(180.連続した数字)
  • LeetCode の C++ 実装 (組み合わせの最大数は 179)
  • LeetCode の SQL 実装 (197. 気温上昇)

<<:  CSS で背景ぼかし効果を実装するサンプルコード

>>:  ウェブデザインにおける画像フォーマットとデザインの関係を詳しく説明

推薦する

MySQL に接続されている IP アドレスを表示する方法の例

具体的な方法:まずコマンドプロンプトを開きます。次に、[ mysql -u root -p ] コマ...

CSSはBEM命名規則の実践を使用する

クラスを見るとき、どのような情報を得たいですか?このクラスはどこで使用され、その機能は何ですか?この...

MySQL InnoDB row_id 境界オーバーフロー検証方法の手順

背景クラスメートと row_id の境界問題について話し合ったので、ここで詳しく説明します。 Inn...

Vue ローカルコンポーネントデータ共有 Vue.observable() の使用

コンポーネントが詳細になるにつれて、複数のコンポーネントが状態を共有する状況に遭遇するでしょう。Vu...

jQuery プロジェクトで重複送信を防ぐ方法

新しいプロジェクトでは、axios によって重複した送信を防ぐことができますが、古いプロジェクト (...

冗長カーネルを削除するLinuxディープインの実装方法

前の記事では、deepin linux に新しいカーネルを手動でインストールする方法について説明しま...

ウォーターフォールレイアウト+ダイナミックレンダリングの実装

目次典型的なウォーターフォールウェブサイトウォーターフォールフローレイアウトの原則一般的な考え方具体...

SQLはLeetCodeを実装します(180.連続した数字)

[LeetCode] 180. 連続した数字少なくとも 3 回連続して出現するすべての数字を検索す...

MySQL の不正な文字列値の解決方法

MySQL を使用して中国語の文字を挿入すると、多くの友人から次のエラーが報告されます。 これは、文...

Vueでaxiosを簡単にカプセル化する方法

Vueにaxiosを挿入する 'axios' から axios をインポートします。...

Linux に Python クローラー スクリプトを展開し、スケジュールされたタスクを設定する方法

昨年、プロジェクトの必要性により、Python でクローラーを作成しました。クロールされたデータは、...

MySQL データ操作 - DML ステートメントの使用

例示するDML(データ操作言語)とは、データベースの追加、削除、変更を行うための操作命令のことです。...

react-beautiful-dnd を使用してリスト間のドラッグ アンド ドロップを実装する

目次react-beautiful-dndを選ぶ理由基本的な使い方基本概念使い方使用中に発生した問題...

JavaScript Three.js でテキストを作成する最初の経験

目次効果テキストの作成を開始するまずフォントローダーを作成するフォントライブラリを読み込むテキストジ...

MySQL ジョイントテーブルクエリの簡単な例

MySql は結合テーブルクエリを使用しますが、初心者には理解しにくい場合があります。以下の記事では...