Как найти AVG группы в Hive и сравнить с ней? - PullRequest
0 голосов
/ 26 ноября 2018

Я не уверен, что заголовок хорошо объясняет мою проблему, я подробно опишу ее здесь.

У меня есть таблица с именем 121_salaries, в которой есть столбцы empname, адрес, название работы, отдел и зарплата.

Я хочу найти среднюю зарплату по каждой должности, а затем отобразить информацию о сотрудниках, зарплата которых значительно выше, чем у остальных, с указанием этой должности.

Запрос, который у меня имеется на данный моментis:

SELECT * FROM (SELECT jobtitle, salary, AVG(salary) OVER() AS avgSal FROM 121_salaries) t WHERE salary > 1.5*avgSal;

Этот запрос дает мне результаты, но он усредняет весь столбец зарплаты вместо того, чтобы находить среднее значение для каждой должности.

Любая помощь приветствуется и заранее благодарна!

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы должны использовать partition by в расчете avg, чтобы вычислялось среднее значение для названия работы.Пустое предложение over() вычисляет avg для всех значений в столбце.

SELECT * 
FROM (SELECT jobtitle, salary, AVG(salary) OVER(PARTITION BY jobtitle) AS avgSal 
      FROM 121_salaries
     ) t 
WHERE salary > 1.5*avgSal
0 голосов
/ 26 ноября 2018

Группируйте по заголовкам заданий, чтобы получить среднюю зарплату для каждого заголовка задания, а затем присоединяйтесь к заголовку задания и фильтру, чтобы получить empname, которое в 1,5 раза превышает среднюю зарплату для этого задания.

SELECT empname,jobtitle 
FROM 121_salaries a JOIN (     
SELECT jobtitle, AVG(salary) avg_salary 
FROM 121_salaries
GROUP BY jobtitle) b on a.jobtitle=b.jobtitle
WHERE a.salary > 1.5 * b.avg_salary
...