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

MySQL:如何按球员计算单列中前5局与后5局的得分总和?

实现MySQL查询计算球员前5局与后5局得分总和

当然可以实现这个需求!由于你没提供具体的表结构,我先基于板球统计场景的常规字段来假设一张表:player_inning_stats,包含以下核心字段:

  • player_id:球员唯一标识ID
  • player_name:球员姓名
  • over_number:该局的序号(比如1到20,代表 innings 里的第几局)
  • runs:该局的得分

核心实现思路

我们可以通过窗口函数+条件聚合的组合来完成:先给每个球员的局数按顺序排好名次,再判断哪些局属于前5局、哪些属于后5局,最后分别分组求和。

完整SQL代码

WITH player_over_ranks AS (
    SELECT
        player_id,
        player_name,
        over_number,
        runs,
        -- 给每个球员的局数按局号升序排名
        ROW_NUMBER() OVER (PARTITION BY player_id ORDER BY over_number) AS over_rank,
        -- 计算每个球员的总局数
        COUNT(*) OVER (PARTITION BY player_id) AS total_overs
    FROM player_inning_stats
)
SELECT
    player_id,
    player_name,
    -- 累加前5局的得分
    SUM(CASE WHEN over_rank <= 5 THEN runs ELSE 0 END) AS first_5_overs_runs,
    -- 累加后5局的得分(总局数不足5局时自动取所有局得分)
    SUM(CASE WHEN over_rank >= (total_overs - 4) THEN runs ELSE 0 END) AS last_5_overs_runs
FROM player_over_ranks
GROUP BY player_id, player_name
ORDER BY player_id;

代码解释

  1. CTE 部分:player_over_ranks 用来给每个球员的每一局生成两个关键值:
    • over_rank:按局号顺序给每个球员的局数排名(比如第1局是1,第2局是2,以此类推)
    • total_overs:统计每个球员一共打了多少局
  2. 主查询部分:
    • first_5_overs_runs:用CASE WHEN筛选出排名前5的局,把这些局的得分累加,非前5局的得分按0计算
    • last_5_overs_runs:通过total_overs - 4定位最后5局的起始排名(比如总局数20的话,起始排名是16,对应16-20局;如果总局数只有3局,total_overs -4是-1,所有局都会被纳入计算)
  3. 最后按球员ID和姓名分组,得到每个球员的两个得分总和,并且按ID排序方便查看。

适配你的表结构的小技巧

  • 如果你的球员唯一标识不是player_id,把所有player_id替换成你的字段即可(比如player_code)
  • 如果局数的排序逻辑不是按over_number(比如按比赛时间顺序),修改ORDER BY over_number为你的排序字段(比如match_time)
  • 如果你只想保留总局数≥5的球员,可以在主查询末尾加HAVING MAX(total_overs) >=5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:00:57