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

世界杯分组最高得分者查询: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:11:20