Вложенные агрегатные функции Max (Avg ()) в SQL [закрыто]

Я пишу этот запрос в SQL:

select MAX(AVG(salary) ) from employees group by department_id;

Сначала я получу группы поdepartment_id а что дальше будет?

 David Aldridge10 июн. 2013 г., 20:06
Что это за СУРБД?
 Alaa' Agha10 июн. 2013 г., 20:12
@StingyJack нет, яЯ не получаю ошибку, но я нене понимаю результат, как это работает
 Alaa' Agha10 июн. 2013 г., 20:12
да @MichaelBerkowski оракул позволяет это
 StingyJack10 июн. 2013 г., 20:04
Вы получаете ошибку или неожиданный результат?
 Michael Berkowski10 июн. 2013 г., 20:04
Это не удастся. Вы можете'Вложить агрегатные функции и вместо этого поместить внутреннюю в подзапрос.
 Michael Berkowski10 июн. 2013 г., 20:11
Я забираю это назад - Oracle разрешает это.sqlfiddle.com/#!4/7a123/2
 Michael Berkowski10 июн. 2013 г., 20:10
Это недопустимо во всех 4 СУБД, доступных для тестирования на SQLFiddle.comsqlfiddle.com/#!6/7a123/2

Ответы на вопрос(5)

select AVG(salary)
from employees
group by department_id
order by avg(salary) desc
limit 1

limit 1 возможноtop 1 (SQL Server) или подзапрос сrownum = 1 (Oracle).

 juergen d10 июн. 2013 г., 20:17
+1 умный. Нет необходимости в подзапросе.
 David Aldridge10 июн. 2013 г., 20:27
... кроме Oracle до 12c, для которого потребуются подзапрос и rownum <= 1 предикат :(

в зависимости от вашей РСУБД, для этого потребуется скрыть подзапрос

select max(AveragesByDept.avgSalary) 
from ( 
    select avgSalary=avg(salary) 
    from employees
    group by department_id
    ) AveragesByDept
 David Aldridge10 июн. 2013 г., 20:28
Просто чтобы отметить, что необходимость подзапроса зависит от СУБД
 Brad10 июн. 2013 г., 20:13
@NitinMidha абсолютно верно. Идентификатор отдела - правильный. виноват.
 Nitin Midha10 июн. 2013 г., 20:07
Почему у вас есть группа по EmployeeID? Это даст совсем другие результаты. Это должно быть на DepartmentId ...
 h8red21 дек. 2013 г., 12:27
Что означает этот М в конце?
 Brad22 дек. 2013 г., 07:39
@ h8red M - псевдоним для всего выражения подзапроса. Я могу переписать, чтобы быть более явным, хотя.
 Brad10 июн. 2013 г., 20:39
@DavidAldridge должным образом отметил
Решение Вопроса

Если у вас есть что-то вроде этого

EmployeeId DepartmentId Salary
    1          1         10              
    2          1         30
    3          2         30
    4          2         40
    5          2         20
    6          3         40
    7          3         50

после группировки

DepartmentId    AVG(Salary) 
    1             (10+30)/2 = 20
    2             (30+40+20)/3 = 30
    3             (40+50)/2= 45

Таким образом, приведенный ниже запрос вернет 45 как Максимальная средняя заработная плата для DepartmentId 3

SELECT MAX(x.avg) 
FROM ( SELECT AVG(salary)as avg FROM employees group by department_id)x;
 lkegel14 окт. 2016 г., 10:51
Я неЯ верю, что это так в каждой СУРБД. @ nikola-mitev Какая RDMBS позволяет объединять два агрегата?
 Chandan Bhattad06 янв. 2019 г., 11:56
Oracle позволяет вам сделать это.sqlfiddle.com/#!6/7a123/2 Мы можем иметь вложенные аггрегаты

зависит от поддержки СУБД, но если она поддерживается, вы 'Я получу наибольшее из ведомственных средних для зарплаты.

Группировка по применяется к внутреннему агрегату, а внешний агрегат не группируется.

 David Aldridge10 июн. 2013 г., 20:11
В соответствии со стандартом ANSI выЯ получу одну строку и один столбец, даже если таблица пуста, потому что проекция только агрегатных функций всегда возвращает одну строку. Oracle поддерживает это:sqlfiddle.com/#!4/aeff1/3
 Alaa' Agha10 июн. 2013 г., 20:07
так в конце я получу номер или таблицу? благодарю вас.
 Michael Berkowski10 июн. 2013 г., 20:06
Я нене знаю СУРБД, которая на самом деле поддерживает это, хотя ...

Ваш ответ на вопрос