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 フルテキスト インデックス、ジョイント インデックス、Like クエリ、JSON クエリのうち、どれが高速ですか?

目次クエリの背景1. クエリをいいね2. JSON関数クエリ3. 共同インデックスクエリ4. 全文イ...

Divの境界と透明度に関する設定

フレーム:スタイル=”border-style:solid;border-width:5px;bor...

Linux デスクトップ用に Openbox を設定する方法 (推奨)

この記事は、「24 Days of Linux Desktop」の特別シリーズの一部です。 Open...

JavaScript クラス配列の詳細な理解

js 配列はどこでも使用されているため、おそらく誰もがよく知っているでしょうが、配列クラス (疑似配...

MySQL Truncate の使用方法の詳細な説明

目次MySQL 切り捨ての使用1. 構文を切り捨てる2. Truncateの使用上の注意3. TRU...

MySQL データ分析ストレージエンジンの例の説明

目次1. 事例紹介2. システムのデフォルトのストレージエンジンとデフォルトの文字セットを表示する3...

Dockerでudpポート番号を指定する問題を解決する

Docker はコンテナを起動するときにアクセス ポートを指定します。複数の -p オプションを使用...

Gitlab-ci を使用してリモート マシンに継続的にデプロイする方法 (詳細なチュートリアル)

簡単に言うと、今日は Gitlab-CI を使用してリモート サーバーに自動的にデプロイする方法につ...

Win7x64でのMySQL 5.7.18解凍版のインストール方法

関連記事: Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールする...

MySql マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...

Vueはショッピングカート決済機能をシミュレートします

この記事では、ショッピングカート決済機能を実現するためのVueの具体的なコードを例として紹介します。...

Angular構造ディレクティブモジュールとスタイルの詳細な説明

目次1. 構造指示モジュールforRoot()を書く3. スタイルの定義ドラッグ時の順序を調整するに...

ウェブサイトのユーザビリティとコンバージョン率を向上させる 25 のツール

ウェブサイトの場合、ユーザビリティとは、ユーザーが必要な情報を効果的に見つけたり、タスクを完了したり...

CSSアニメーションとSVGを組み合わせてエネルギーの流れの効果を作成する

最終的な効果は次のようになります。アニメーションは2つのステップに分かれていますランニング軌道を開発...