Как мне написать запрос, который усредняет агрегат (еще одно среднее)?
Вот что у меня есть до сих пор.
SELECT AVG(stars)
FROM Rating
WHERE mID IN
(SELECT mID
FROM Movie
WHERE year > 1980)
GROUP BY mID
Я хочу усреднить результат этого запроса.
Базовые данные:
(Stars,mID)
(2,104)
(3,104)
(3,107)
(5,107)
(4,108)
(2,108)
(4,108)
Я могу получить средние значения, сгруппированные по mID, с помощью приведенного выше запроса.
[AVG(stars),mID]
(2.50,104)
(4.00,107)
(3.33,108)
Теперь я хочу взять среднее значение (2,5 + 4,0 + 3,33).
Ожидаемый ответ = 3,2767
Вы можете получить общее среднее значение всех оценок как:
SELECT AVG(stars)
FROM Rating
WHERE mID IN (SELECT mID FROM Movie WHERE year > 1980);
Но вы, вероятно, хотите, чтобы каждый фильм имел одинаковый вес. Для этого нам подзапрос:
SELECT AVG(avg_stars)
FROM (SELECT AVG(stars) as avg_stars
FROM Rating
WHERE mID IN (SELECT mID FROM Movie WHERE year > 1980);
GROUP BY mID
) r;
Этот второй ответ с подзапросом был тем, что я искал для Гордона. Спасибо!
Одна часть мне не понятна - Что означает ') r; ' в последней строке сделать? Я предполагаю, что это псевдоним рейтинговой таблицы, но я не понимаю ее функции.
@КарсонКаннингэм . . . Это псевдоним подзапроса. Некоторым базам данных требуются псевдонимы для подзапросов в предложении from
.
Вы можете использовать первый результат как FROM (подзапрос) для основного среднего
select avg(my_avg)
from (
SELECT AVG(stars) my_avg
FROM Rating r
INNER JOIN (
SELECT mID
FROM Movie
WHERE year > 1980
) t on t.mID = r.mID
GROUP BY mID
) t2
Если я правильно вас понимаю, просто удалите группу по оператору