#sql
#sql
Вопрос:
Как мне написать запрос, который усредняет агрегат (другое среднее значение)?
Вот что у меня есть на данный момент.
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)
Я могу получить средние значения, сгруппированные по середине с помощью приведенного выше запроса.
[AVG(stars),mID]
(2.50,104)
(4.00,107)
(3.33,108)
Теперь я хочу взять среднее значение (2.5 4.0 3.33 )
Ожидаемый ответ = 3,2767
Комментарии:
1. Если я вас правильно понимаю, просто удалите оператор group by
Ответ №1:
Вы можете получить общее среднее значение всех оценок как:
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;
Комментарии:
1. Этот второй ответ с подзапросом был тем, что я искал, Гордон. Спасибо!
2. Одна часть, которую я не понимаю — что делает ‘) r; ‘ в последней строке? Я предполагаю, что это псевдоним рейтинговой таблицы, но я не понимаю ее функции.
3. @CarsonCunningham . , , Это сглаживание подзапроса. Некоторые базы данных требуют псевдонимов для подзапросов в
from
предложении.
Ответ №2:
Вы могли бы использовать первый результат в качестве 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