我正在尝试回答有关中等难度的SQL Leetcode问题。问题是要我找到每个部门中薪水最高的人。
我尝试使用GROUP BY,但是无法弄清楚这种方法,所以我尝试使用PARTITION BY来找到每个部门的最高薪水。之后,我将添加一个最终的WHERE语句,在这里我可以过滤出薪水等于最高薪水的人。
这是我到目前为止的查询:
SELECT
Department.Name AS Department,
Employee.Name AS Employee,
Employee.Salary,
MAX(Employee.Salary) OVER (PARTITION BY Department.Name) AS MaxSalary
FROM Employee
LEFT JOIN Department ON Department.id = Employee.DepartmentId
;
有两个表。
EMPLOYEE TABLE:
+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+----+-------+--------+--------------+
DEPARTMENT TABLE:
+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+
正确的输出应如下所示。
CORRECT EXPECTED OUTPUT:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+
运行当前查询导致此消息出现运行时错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(PARTITION BY Department.Name) AS MaxSalary
FROM Employee
LEFT JOIN Department O' at line 7
我已经多次查看了语法,因此我认为对PARTITION BY的工作方式有误。我期望我会在右侧看到每个人的每个部门的最高薪水。像这样:
+----+-------+--------+--------------+-----------+
| Id | Name | Salary | DepartmentId | MaxSalary |
+----+-------+--------+--------------+-----------+
| 1 | Joe | 70000 | 1 | 90000 |
| 2 | Jim | 90000 | 1 | 90000 |
| 3 | Henry | 80000 | 2 | 80000 |
| 4 | Sam | 60000 | 2 | 80000 |
| 5 | Max | 90000 | 1 | 90000 |
+----+-------+--------+--------------+ -----------+
实现这一点之后,我要添加以下行:
WHERE Employee.Salary = MaxSalary;
执行此操作的正确方法是什么?
答案 0 :(得分:0)
您可以考虑使用以下之一:
λ