通过加入获得 SQL 的平均值
Get Average in SQL Through Join
我只是在玩 SQL,我正在尝试执行以下操作。
我有 2 个 table,这是它们的结构:
Movies_metadata Movies
评分table:
Ratings
由于一部电影有很多评级,我想做的是获取每部电影的平均评级并将其显示在仅在元数据 table 中可用的标题旁边。
这是我得到的,但显然我的 SELECT 声明的问题是它会 return 所有电影的平均值并显示每条记录:
SELECT
(SELECT
AVG(rating)
FROM
`movies-dataset.movies_data.ratings`) AS rating_avg,
metadata.title,
metadata.budget,
metadata.revenue,
metadata.genres,
metadata.original_language,
metadata.release_date
FROM
`movies-dataset.movies_data.Movies_metadata` AS metadata
INNER JOIN `movies-dataset.movies_data.ratings` AS ratings
ON metadata.id = ratings.movieId
LIMIT 10
这是一个结果示例:
Result
我想我可以使用 GROUP BY,但是当我尝试时,我收到了一个错误
感谢您的帮助!
以下应该有效:
SELECT movies_metadata.title, AVG(ratings.rating)
FROM movies_metadata
LEFT JOIN ratings ON movies_metadata.id = ratings.movieID
GROUP BY movies_metadata.title
如果不唯一,您可以将 movies_metadata.title
换成 movies_metadata.id
。
LIMIT 函数和GROUP 函数可能相互冲突。尝试将平均评分作为内部连接的一部分,如下所示:
SELECT
ratings.averagerating,
metadata.title,
metadata.budget,
metadata.revenue,
metadata.genres,
metadata.original_language,
metadata.release_date
FROM `movies-dataset.movies_data.Movies_metadata` AS metadata
INNER JOIN (SELECT movieId, AVG(rating) averagerating FROM `movies-dataset.movies_data.ratings` GROUP by movieId) AS ratings
ON metadata.id = ratings.movieId
ORDER BY ratings.averagerating
LIMIT 5
也许可以试试:
Select m.movieID, (r.rate_sum / r.num_rate) as avg_rating
From your_movies_table m
Left Join (select movie_id, sum(rating) as ‘rate_sum’, count(rating) as ‘num_rate’
From your_ratings_table
Group by movie_id) r
On m.movie_id = r.movie_id
我正在使用左连接,因为我不确定是否所有电影都至少被评级过一次。
我只是在玩 SQL,我正在尝试执行以下操作。
我有 2 个 table,这是它们的结构:
Movies_metadata Movies
评分table: Ratings
由于一部电影有很多评级,我想做的是获取每部电影的平均评级并将其显示在仅在元数据 table 中可用的标题旁边。
这是我得到的,但显然我的 SELECT 声明的问题是它会 return 所有电影的平均值并显示每条记录:
SELECT
(SELECT
AVG(rating)
FROM
`movies-dataset.movies_data.ratings`) AS rating_avg,
metadata.title,
metadata.budget,
metadata.revenue,
metadata.genres,
metadata.original_language,
metadata.release_date
FROM
`movies-dataset.movies_data.Movies_metadata` AS metadata
INNER JOIN `movies-dataset.movies_data.ratings` AS ratings
ON metadata.id = ratings.movieId
LIMIT 10
这是一个结果示例:
Result
我想我可以使用 GROUP BY,但是当我尝试时,我收到了一个错误
感谢您的帮助!
以下应该有效:
SELECT movies_metadata.title, AVG(ratings.rating)
FROM movies_metadata
LEFT JOIN ratings ON movies_metadata.id = ratings.movieID
GROUP BY movies_metadata.title
如果不唯一,您可以将 movies_metadata.title
换成 movies_metadata.id
。
LIMIT 函数和GROUP 函数可能相互冲突。尝试将平均评分作为内部连接的一部分,如下所示:
SELECT
ratings.averagerating,
metadata.title,
metadata.budget,
metadata.revenue,
metadata.genres,
metadata.original_language,
metadata.release_date
FROM `movies-dataset.movies_data.Movies_metadata` AS metadata
INNER JOIN (SELECT movieId, AVG(rating) averagerating FROM `movies-dataset.movies_data.ratings` GROUP by movieId) AS ratings
ON metadata.id = ratings.movieId
ORDER BY ratings.averagerating
LIMIT 5
也许可以试试:
Select m.movieID, (r.rate_sum / r.num_rate) as avg_rating
From your_movies_table m
Left Join (select movie_id, sum(rating) as ‘rate_sum’, count(rating) as ‘num_rate’
From your_ratings_table
Group by movie_id) r
On m.movie_id = r.movie_id
我正在使用左连接,因为我不确定是否所有电影都至少被评级过一次。