世界杯分组最高得分者查询:GROUP BY与HAVING聚合问题求助
嘿,我来帮你搞定这个世界杯分组最高得分者的统计问题!你已经把关联表的查询搭好框架了,接下来咱们一步步拆解需求,把SQL写到位。
第一步:先统计每个分组里各球员的进球数
首先咱们先把基础统计做出来,看看每个球员在各自分组里的总进球数,用GROUP BY把数据聚合到「分组+球员」这个维度:
SELECT zonas.nombre AS 分组名称, goles.nombre_jugador AS 球员姓名, COUNT(goles.id) AS 总进球数 FROM zonas LEFT JOIN goles_zonas ON zonas.id = goles_zonas.Id_zona INNER JOIN goles ON goles.id = goles_zonas.id_gol GROUP BY zonas.id, goles.nombre_jugador; -- 用zonas.id是防止分组名称重复的情况,如果名称唯一也可以用zonas.nombre
第二步:找出每个分组的最高得分者
单纯用COUNT+GROUP BY+HAVING很难直接拿到每个分组的最高分——因为HAVING只能过滤当前分组的结果,没法跨分组获取最大值。这时候用窗口函数会更方便,比如RANK()(支持并列第一)或者ROW_NUMBER()(强制唯一排名):
-- 先创建临时结果集,统计每个球员在分组里的进球数 WITH 球员分组进球统计 AS ( SELECT zonas.nombre AS 分组名称, goles.nombre_jugador AS 球员姓名, COUNT(goles.id) AS 总进球数 FROM zonas LEFT JOIN goles_zonas ON zonas.id = goles_zonas.Id_zona INNER JOIN goles ON goles.id = goles_zonas.id_gol GROUP BY zonas.id, goles.nombre_jugador ), -- 给每个分组内的球员按进球数降序排名 分组进球排名 AS ( SELECT 分组名称, 球员姓名, 总进球数, RANK() OVER (PARTITION BY 分组名称 ORDER BY 总进球数 DESC) AS 排名 FROM 球员分组进球统计 ) -- 筛选出排名第一的球员,就是每个分组的最高得分者 SELECT 分组名称, 球员姓名, 总进球数 FROM 分组进球排名 WHERE 排名 = 1;
如果你的数据库不支持CTE(WITH语句),也可以用嵌套子查询实现,不过CTE的可读性会更好。
第三步:单独统计梅西的进球数(按分组)
如果想单独查看梅西在各个分组的进球情况,直接在查询里加WHERE条件筛选即可:
SELECT zonas.nombre AS 分组名称, COUNT(goles.id) AS 梅西进球数 FROM zonas LEFT JOIN goles_zonas ON zonas.id = goles_zonas.Id_zona INNER JOIN goles ON goles.id = goles_zonas.id_gol WHERE goles.nombre_jugador = 'Lionel Messi' -- 这里要和你数据库里的球员名字完全一致,比如可能是'Messi'或全名 GROUP BY zonas.id;
为什么你用
COUNT+GROUP BY+HAVING会遇到困难? HAVING的作用是过滤分组后的结果,比如你可以用它筛选进球数大于5的球员,但要找每个分组的最大值,HAVING没办法直接引用「当前分组的最大进球数」——除非嵌套多层子查询,写法会非常绕。而窗口函数是专门用来处理这种「分组内排名/对比」的场景,比单纯用GROUP BY+HAVING更高效易读。
内容的提问来源于stack exchange,提问作者David Salas Boscan
相关产品推荐
相关产品推荐

