SQL技术求助:如何获取电影评分排名年代及找出平均评分最高的年代?
嘿,作为SQL新手碰到搞不定的问题太正常啦,别慌!我来帮你搞定这两个问题,下面是具体的思路和SQL写法,你可以根据自己的实际表结构调整~
问题1:获取电影评分排名对应的年代
首先得明确,我们需要把电影的评分和它的上映年代关联起来,再计算排名。假设你有两张核心表:
movies:存储电影基础信息,比如movie_id(电影ID)、release_year(上映年代)、title(电影名)ratings:存储评分数据,比如movie_id、rating(评分值)
这里用CTE(公共表表达式)先计算出每部电影的评分排名,再关联年代信息,逻辑更清晰:
WITH movie_rating_ranks AS ( SELECT m.movie_id, m.title, m.release_year, r.rating, -- 按评分降序排名,相同评分的电影会获得相同排名,下一个排名会跳过(比如两个第1名,下一个是第3名) -- 如果想要连续排名(两个第1名后是第2名),把RANK()换成DENSE_RANK()即可 RANK() OVER (ORDER BY r.rating DESC) AS rating_rank FROM movies m INNER JOIN ratings r ON m.movie_id = r.movie_id ) -- 这里可以按需筛选,比如只看前10名的电影及对应的年代 SELECT rating_rank, release_year, title, rating FROM movie_rating_ranks WHERE rating_rank <= 10 ORDER BY rating_rank;
问题2:找出平均评分最高的电影年代
这个问题需要按年代分组,计算每个年代的平均评分,再找出最高的那个。这里给你两种常用写法:
方法一:简单分组排序取TOP1
适合只需要返回一个结果的场景(如果有多个年代平均评分相同,只会返回第一个):
SELECT m.release_year, ROUND(AVG(r.rating), 2) AS avg_rating -- 用ROUND保留两位小数更直观 FROM movies m INNER JOIN ratings r ON m.movie_id = r.movie_id GROUP BY m.release_year ORDER BY avg_rating DESC LIMIT 1;
方法二:用窗口函数处理并列第一的情况
如果存在多个年代平均评分相同且都是最高的,这种写法会把所有符合条件的年代都返回:
WITH decade_avg_ratings AS ( SELECT m.release_year, ROUND(AVG(r.rating), 2) AS avg_rating, RANK() OVER (ORDER BY AVG(r.rating) DESC) AS rank FROM movies m INNER JOIN ratings r ON m.movie_id = r.movie_id GROUP BY m.release_year ) SELECT release_year, avg_rating FROM decade_avg_ratings WHERE rank = 1;
内容的提问来源于stack exchange,提问作者user12920775
相关产品推荐
相关产品推荐

