Как найти среднюю оценку лучших фильмов в MySQL - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть таблица Films

id  release_year    category_id rating
1   2015                 1         8
2   2015                 2        8.5
3   2015                 3         9
4   2016                 2        8.2
5   2016                 1        8.4
6   2017                 2         7

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

вывод должен быть

id  release_year    category_id rating  avg_better_films
1   2015                1         8          8.75
2   2015                2        8.5           9
3   2015                3         9        Not Available
4   2016                2        8.2          8.4
5   2016                1        8.4       Not Available
6   2017                2         7        Not Available

, и вы можете видеть, когда фильм имеет лучший рейтинг в год выпуска, он покажет «Не доступно»

Знаете ли вы, как получить этот вывод в MySQL

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018
  • Мы можем использовать коррелированный подзапрос для расчета среднего рейтинга "лучших фильмов" за тот же год.
  • Подзапрос вернет null в случае отсутствиялучшие фильмы для конкретного фильма и года.
  • Затем мы можем использовать функцию Coalesce(), чтобы справиться со случаем, когда «лучшая пленка» для года не найдена.
  • Благодаря @ Strawberry в комментариях нам нужно сделать + 0 для результата подзапроса, чтобы MySQL рассматривал его как число

Попробуйте следующее:

SELECT
  t1.id, 
  t1.release_year, 
  t1.category_id, 
  t1.rating, 
  COALESCE(
           (
            SELECT AVG(t2.rating) 
            FROM Films AS t2
            WHERE t2.rating > t1.rating AND  -- higher rating films
                  t2.release_year = t1.release_year -- films from same year
           ) + 0, 
           'Not Available' -- handle null result of subquery
          ) AS avg_better_films
FROM Films AS t1

SQL Fiddle: http://sqlfiddle.com/#!9/4960ea/3

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

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

Я бы порекомендовал коррелированный подзапрос, который выглядит следующим образом:

SELECT f.*,
       (SELECT COALESCE(FORMAT(AVG(t2.rating), 2), 'Not Available)
            FROM Films f2
            WHERE f2.rating > f.rating AND 
                  f2.release_year = f.release_year
       ) AS avg_better_films
FROM Films f

Примечания:

  • Псевдонимы таблиц должны быть аббревиатурами для имени таблицы.
  • Если ни одна строка не соответствует предложению WHERE в подзапросе, то AVG() возвращает NULL. Следовательно, COALESCE() может быть в подзапросе.
  • FORMAT() используется для преобразования среднего рейтинга в строку.
0 голосов
/ 16 ноября 2018

вы можете попробовать использовать скалярный подзапрос

select *, (select avg(rating) from Films b on a.release_year=b.release_year) as avg_film_Rating
from Films a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...