LeetCode :. 184最高給従業員の部門

トピックへのリンク:https://leetcode-cn.com/problems/department-highest-salary/

タイトル

Employee 次の表は、各従業員は、その対応するID、給与と部門IDを持ち、すべての従業員に関する情報が含まれています。

---- + -------- + ------- + + -------------- +
| ID |名前|給与| DepartmentIdの|
+ - - + -------- + ------- + -------------- +
| 1 |ジョー| 70000 | 1 |
| 2 |ヘンリー| 80000 | 2 |
| 3 |サム| 60000 | 2 |
| 4 |最大| 90000 | 1 |
+ ---- + -------- + ------- + ------ + --------
部門のテーブルには、会社のすべてのセクターに関する情報が含まれています。

+ ---------- + ---- +
| ID |名前|
+ ---- + ---------- +
| 1 | IT |
| 2 |セールス|
+ ---- + ---------- +
各部門の従業員の最も高い賃金を見つけるために、SQLクエリを記述します。例えば、上記の表によると、マックスはヘンリーが営業部門で最も高い賃金を持っていた、IT部門で最も高い賃金を持っていました。

+ ------------ + ---------- + -------- +
| 部門| 従業員| 給与|
+ ------------ + ---------- + -------- +
| IT | マックス| 90000 |
| セールス| ヘンリー| 80000 |
+ ------------ + ---------- + -------- +

出典:ボタン(LeetCode)滞在
:リンクhttps://leetcode-cn.com/problems/department-highest-salary
すべてのネットワークからの控除が著作権を保有します。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。

答え

ハハ、経由のデバッグをデバッグする上で初めて。

---- oracle ----
/* Write your PL/SQL query statement below */
select b.Name as Department,
       t.Name as Employee,
       t.Salary as Salary
from Department b
left join
(
select Name,
       Salary,
       DepartmentId,
       rank() over(partition by DepartmentId order by Salary desc) as rank
from Employee
) t
on t.DepartmentId = b.Id
where t.rank = 1; ---- 791ms

サンプルをテストすることによって、状況を観察することによって、コードの自分の問題を発見しました。

スタート使いrow_number()そう代わりに、並べ替えと同じ給与が異なるランキングを取得します、タイトルの要件を満たしていないことが判明した時間をrank()通じ。

最初の時間が経過していない、我々はテストケースの存在が見つかったDepartmentテーブルに空を存在するので、left join彼らができる、2つのテーブルの位置を交換します。

使用joininの回答。

---- MySQL ----
select b.name as Department,
       a.name as Employee,
       Salary
from Employee a
join Department b
on a.DepartmentId = b.Id
where (a.DepartmentId, Salary) in
(
select DepartmentId,
       max(Salary) as Salary
from Employee
group by DepartmentId
); ---- 221ms

使用しleft joinたサンプルがありますので、同じ間違った報告書は、合格変更していないjoinか、または直接inner joinすることができます。

考えます

ステップ、思考、思考、最も重要なことを考えバイステップ!

MySQL中には、in2つのフィールドかもしれません。

select xxx
from yyy
where (a, b) in (c, d);

全体的に、まだ私が使用し始めrank()ハハ、最も美しいの機能を!

総括に続いてoracle4つのソート機能を使用すること。

おすすめ

転載: www.cnblogs.com/hider/p/11746419.html