Вложенные агрегатные функции - SQL - PullRequest
11 голосов
/ 15 ноября 2011

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 16 ноября 2011

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

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

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

7 голосов
/ 15 ноября 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 info

4 голосов
/ 15 ноября 2011

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

SELECT MAX(
   SELECT AVG(m."Rating")
   FROM awards a, movies m
   WHERE a."Title" = m."Title"
   GROUP BY a."Award"
)
0 голосов
/ 16 июня 2019

Другой способ заключается в использовании оконного 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;

ДБ <> Fiddle demo

...