Как усреднить сводный столбец

#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