SQL группировка не приводит к среднему - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь решить эту практическую задачу на SQLite.

Найдите разницу между средней оценкой фильмов, выпущенных до 1980 года, и средней оценкой фильмов, выпущенных после 1980 года. ( Make обязательно рассчитайте средний рейтинг для каждого mov ie, а затем среднее из этих средних для фильмов до 1980 года и фильмов после. Не просто рассчитывайте общий средний рейтинг до и после 1980 года .

Данные здесь :

Вот что я получил до сих пор (для первой группы <1980): </p>

select title, avg(stars) from Movie join Rating
on Movie.mID=Rating.mID
where Year<1980
group by title

Может ли кто-нибудь помочь с простое решение? Не знаю, как двигаться дальше.

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

Сначала получите среднее значение для каждого mov ie, а затем используйте условное агрегирование результатов:

select 
  avg(case when m.year < 1980 then t.stars end) -
  avg(case when m.year >= 1980 then t.stars end) dif
from movie m
inner join (
  select mid, avg(stars) stars
  from rating
  group by mid
) t on t.mid = m.mid

Если требование не включает год 1980, измените m.year >= 1980 на m.year > 1980.

0 голосов
/ 26 августа 2020

Я нашел решение:

select ((select avg(test) from (Select avg(stars) as test from Rating join Movie
on Rating.mID=Movie.mID
group by title
Having year<1980))-(select avg(test) from (Select avg(stars) as test from Rating join Movie
on Rating.mID=Movie.mID
group by title
Having year>1980)))
0 голосов
/ 05 августа 2020

Во-первых, не агрегируйте по title. Фильмы отличает id , а не название (которое теоретически может повторяться).

Вы можете использовать условное агрегирование:

select m.mID, avg(case when m.year < 1980 then r.stars end) as pre_1980_avg,
       avg(case when m.year > 1980 then r.stars end) as post_1980_avg
from Movie m join
     Rating r
     on m.mID = r.mID
group by m.mID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...