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

修改版IMDb数据库查询遇SQL报错:列需在GROUP BY或聚合函数中

解决你的SQL GROUP BY报错问题

嘿,这个报错是很多SQL新手都会碰到的,我来帮你拆解一下问题所在,再给出修正方案!

错误原因分析

你遇到的column must appear in the GROUP BY clause or be used in an aggregate function错误,本质是因为你用了GROUP BY year,但在SELECT列表里的primary_name、release_year(我猜你这里可能是笔误,应该是year?)既没有被包含在GROUP BY里,也没有用MAX()/MIN()这类聚合函数包裹。

现代SQL数据库(比如PostgreSQL、MySQL 5.7+)都遵循严格的GROUP BY规则:分组后,SELECT里的列要么是GROUP BY里的分组键,要么是被聚合函数处理过的结果,否则数据库不知道该返回分组里的哪一行数据给你。

另外,你的查询还有两个小问题:

  • HAVING子句里的title_category = 'film'其实应该放在WHERE里,因为它是用来过滤分组前的行(筛选出所有电影),而不是过滤分组后的结果;year > 1989也可以移到WHERE里,效率更高。
  • NATURAL JOIN虽然简洁,但很容易因为表中同名的列(比如可能有多个id列)导致意外的连接结果,建议显式指定JOIN条件更稳妥。

修正方案(分两种场景)

场景1:只想获取每个年份的最高评分,以及该年份

如果你的需求只是统计1990年后每个年份的电影最高评分,那可以简化查询:

SELECT year, MAX(rating) AS highest_rating
FROM titles
JOIN primary_names ON titles.title_id = primary_names.title_id
JOIN title_ratings ON titles.title_id = title_ratings.title_id
WHERE title_category = 'film' AND year > 1989
GROUP BY year
ORDER BY year;

场景2:想获取每个年份里评分最高的电影名称、年份和评分

如果需要同时拿到对应电影的名称,因为一个年份可能有多个电影并列最高分,用窗口函数会更合适:

WITH ranked_films AS (
    SELECT 
        primary_name,
        year,
        rating,
        RANK() OVER (PARTITION BY year ORDER BY rating DESC) AS rating_rank
    FROM titles
    JOIN primary_names ON titles.title_id = primary_names.title_id
    JOIN title_ratings ON titles.title_id = title_ratings.title_id
    WHERE title_category = 'film' AND year > 1989
)
SELECT primary_name, year, rating AS highest_rating
FROM ranked_films
WHERE rating_rank = 1
ORDER BY year;

这里用RANK()的好处是,如果同一年有多个电影评分相同且都是最高,都会被保留;如果只想返回其中一个,可以换成ROW_NUMBER()。

额外提醒

  • 尽量避免NATURAL JOIN,显式写ON条件能让你的查询逻辑更清晰,也减少意外bug。
  • 注意列名的一致性:你原查询里写了release_year但GROUP BY的是year,确认一下表中的列名到底是哪个,别搞混了。

内容的提问来源于stack exchange,提问作者MMMMMCK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:08:14