You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:02:39