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

能否按主查询字段分组子查询?MLB比赛日志统计问题

解决西雅图水手队客场对阵美联球队的分组胜负统计问题

问题核心

需要统计西雅图水手队(SEA)2017年后客场对阵美联(AL)球队的打击数据(安打H、本垒打HR、打点RBI等),并按主队分组,同时要按主队分别统计水手队在该客场的胜负场次。原SQL中的子查询返回的是水手队作为主队的整体胜负数,而非作为客队对阵特定主队时的胜负,且尝试统计主场获胜场次时错误得到总比赛数。

原代码问题分析

  • 两个子查询未关联外层查询的home_team,无论外层分组是哪个主队,子查询都返回水手队作为主队的总胜场/总负场,完全不符合需求。
  • 直接用(home_team_score < visitor_team_score)统计胜负时,未过滤水手队作为客队的条件,导致统计结果是所有客队获胜的总场次,而非分组后的对应场次。

修正后的SQL代码

-- 西雅图水手队2017年后客场对阵美联球队的打击数据+分组胜负统计
SELECT
    home_team AS 对阵主队,
    COUNT(entry_id) AS 比赛场数G,
    -- 统计水手队(客队)获胜场次:客队得分>主队得分
    SUM(CASE WHEN visitor_team_score > home_team_score THEN 1 ELSE 0 END) AS 胜场W,
    -- 统计水手队(客队)失利场次:客队得分<主队得分
    SUM(CASE WHEN visitor_team_score < home_team_score THEN 1 ELSE 0 END) AS 负场L,
    SUM(visitor_at_bats) AS 打数AB,
    SUM(visitor_hits) AS 安打H,
    ROUND(CAST(SUM(visitor_hits) AS DECIMAL)/SUM(visitor_at_bats), 3) AS 打击率AVG,
    SUM(visitor_home_runs) AS 本垒打HR,
    SUM(visitor_doubles) AS 二垒安打,
    SUM(visitor_triples) AS 三垒安打,
    SUM(visitor_rbi) AS 打点RBI,
    SUM(visitor_so) AS 三振SO,
    SUM(visitor_bb) AS 保送BB,
    SUM(visitor_lob) AS 残垒LOB
FROM
    GAME_LOG_ENTRY
WHERE
    visit_team = 'SEA'          -- 水手队作为客队
    AND home_league = 'AL'      -- 主队属于美联
    AND game_date > '2017-01-01'-- 2017年后的比赛
GROUP BY
    home_team
ORDER BY
    胜场W DESC;

关键修正点

  1. 条件聚合替代子查询:通过SUM(CASE ...)直接在分组统计中计算每个主队对应的水手队胜负场次,避免无关联子查询的错误,同时提升查询性能。
  2. 修正打击率计算精度:将安打数转为DECIMAL类型,避免整数除法导致的精度丢失,确保打击率结果准确。
  3. 移除无效分组字段:原代码中GROUP BY home_team, W, L是错误的,修正后仅按home_team分组即可。
  4. 明确胜负判断逻辑:水手队作为客队,获胜条件为visitor_team_score > home_team_score,失利条件为visitor_team_score < home_team_score,可根据需求补充平局场次统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:40:14