Поиск списка максимальной средней заработной платы по отделу с отображением как максимальной средней заработной платы, так и идентификатора отдела

#oracle

Вопрос:

Когда я пытаюсь это сделать без отображения department_id, это работает нормально, как :

 SQL> SELECT MAX(AVG(SALARY)) FROM EMPLOYEE GROUP BY DEPARTMENT_ID;

MAX(AVG(SALARY))
----------------
          800000
 

Но когда я тоже хочу отобразить department_id, это приводит к следующей ошибке:

 SQL> SELECT DEPARTMENT_ID, MAX(AVG(SALARY)) FROM EMPLOYEE GROUP BY DEPARTMENT_ID;
SELECT DEPARTMENT_ID, MAX(AVG(SALARY)) FROM EMPLOYEE GROUP BY DEPARTMENT_ID
       *
ERROR at line 1:
ORA-00937: not a single-group group function
 

Есть ли этому какое-то объяснение? Что я делаю не так? Я просмотрел ответы на предыдущие подобные вопросы и попробовал их решения, но получил ту же или какую-то другую ошибку. Любая помощь будет признательна.

Ответ №1:

Я предлагаю вам использовать

 SELECT department_id, avg_salary
  FROM (  SELECT DEPARTMENT_ID,
                 AVG (SALARY) avg_salary,
                 RANK () OVER (ORDER BY AVG (salary) DESC) rnk
            FROM EMPLOYEE
        GROUP BY DEPARTMENT_ID)
 WHERE rnk = 1;
 

т.е.

  • используйте свой первый запрос в качестве «источника»
    • кроме того, ранжируйте средние зарплаты в порядке убывания (с помощью rank аналитической функции)
  • выберите строку, которая занимает самое высокое место