Невозможно определить синтаксическую проблему с использованием MAX и OVER PARTITION BY - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь ответить на вопрос 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

IЯ просматривал синтаксис несколько раз, поэтому я предполагаю, что это неверное понимание того, как работает 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;

Как правильно это сделать?

1 Ответ

0 голосов
/ 05 июня 2019

Вы можете использовать один из следующих вариантов:

SELECT D.Name AS Department, E.Name AS Employee, E.Salary
FROM Employee AS E LEFT JOIN Department AS D ON E.DepartmentId = D.id
WHERE (E.Salary = (SELECT MAX(X.Salary) FROM Employee AS X WHERE (X.DepartmentId = E.DepartmentId)));

SELECT D.Name AS Department, E.Name AS Employee, E.Salary
FROM Employee AS E LEFT JOIN Department AS D ON E.DepartmentId = D.id
INNER JOIN (SELECT DepartmentId, MAX(Salary) AS MaxSalary FROM Employee GROUP BY DepartmentId) AS X ON E.DepartmentId = X.DepartmentId AND E.Salary = X.MaxSalary;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...