Вложенные агрегатные функции — SQL

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

Я пробовал что-то вроде этого:

SELECT MAX(AVG(m."Rating"))
FROM awards a, movies m
WHERE a."Title" = m."Title"
GROUP BY a."Award"

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


person steve    schedule 15.11.2011    source источник


Ответы (4)


Если вас интересует только само значение, это должно сделать следующее:

SELECT MAX(avg_rating)
FROM (
    SELECT AVG(m."Rating") as avg_rating
    FROM awards a, movies m
    WHERE a."Title" = m."Title"
    GROUP BY a."Award"
) t

В противном случае решение Адриана лучше.

person a_horse_with_no_name    schedule 15.11.2011

Это принесет желаемый результат:

SELECT a."Award", AVG(m."Rating")
FROM awards a, movies m
WHERE a."Title" = m."Title"
GROUP BY a."Award"
ORDER by AVG(m."Rating") desc
LIMIT 1

Это позволит вам не только получить значение MAX, но и соответствующую информацию Award.

person Adriano Carneiro    schedule 15.11.2011
comment
@Julian Я никогда не говорил, что LIMIT - это стандарт SQL. Это решает проблему OP, потому что LIMIT также доступен в PostGreSQL (не только MySQL!), Которая является СУБД OP. - person Adriano Carneiro; 15.02.2012

Вы пробовали это?

SELECT MAX(
   SELECT AVG(m."Rating")
   FROM awards a, movies m
   WHERE a."Title" = m."Title"
   GROUP BY a."Award"
)
person Jeff Stock    schedule 15.11.2011
comment
Спасибо, но у этого есть синтаксическая ошибка в или около SELECT. Не уверен, что это будет - person steve; 15.11.2011
comment
@steve, комментирование внутреннего SELECT SQL с помощью набора фигурных скобок решит эту ошибку. Фигурные скобки заставляют выполнять скалярный запрос SELECT до срабатывания MAX(). - person Robins Tharakan; 26.12.2014

Другой способ - использовать оконный MAX:

SELECT MAX(AVG(m."Rating")) OVER()
FROM awards a -- proper JOIN syntax
JOIN movies m ON a."Title" = m."Title"     
GROUP BY a."Award"
LIMIT 1;

db‹>демонстрация скрипки

person Lukasz Szozda    schedule 16.06.2019