Макс зарплата с одним GroupBy без Joins - PullRequest
0 голосов
/ 09 июня 2018

Схема для РАБОТНИКА

(ID, EMPLOYEENAME, SALARY, ORGANIZATIONID)

Запрос для решения: найдите имена сотрудников в каждой организации с максимальной зарплатой без присоединения .

SELECT E.* 
FROM EMPLOYEE E,
 (SELECT EMP.ORGANIZATIONID, MAX(EMP.SALARY)
 FROM EMPLOYEE EMP
 GROUP BY EMP.ORGANIZATIONID) MAXSALARY
WHERE MAXSALARY.SALARY =E.SALARY
AND E.ORGANIZATIONID=EMP.ORGANIZATIONID ;

Есть ли способ избежать объединения?Я использую Spark SQL API и соединения вызывают дополнительную случайную операцию, которая стоит дорого.Есть ли способ получить имя сотрудника при получении максимальной зарплаты?

Предположим, у вас есть один сотрудник в каждой организации с максимальной зарплатой

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Попробуйте это:

SELECT P.ORGANIZATIONID, P.EMPLOYEENAME
FROM EMPLOYEE P
WHERE P.SALARY = (SELECT MAX(E.SALARY) FROM EMPLOYEE E WHERE P.ORGANIZATIONID = E.ORGANIZATIONID)
GROUP BY P.ORGANIZATIONID, P.EMPLOYEENAME
0 голосов
/ 09 июня 2018

Попробуйте это:

SELECT EMPLOYEENAME FROM EMPLOYEE 
WHERE SALARY IN (SELECT MAX(SALARY) FROM EMPLOYEE GROUP BY ORGANIZATIONID)
0 голосов
/ 09 июня 2018

Вы можете использовать PARTITION BY с Spark SQL, как показано ниже (хотя для этого потребуется подзапрос)

SELECT E.* 
FROM 
 (SELECT EMP.EMPLOYEENAME, EMP.ORGANIZATIONID, EMP.SALARY,
  row_number() OVER (PARTITION BY ORGANIZATIONID ORDER BY SALARY DESC) as rank
  FROM EMPLOYEE EMP
 ) AS E
WHERE E.rank=1
...