MySQL:如何按球员计算单列中前5局与后5局的得分总和?
实现MySQL查询计算球员前5局与后5局得分总和
当然可以实现这个需求!由于你没提供具体的表结构,我先基于板球统计场景的常规字段来假设一张表:player_inning_stats,包含以下核心字段:
player_id:球员唯一标识IDplayer_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;
代码解释
- CTE 部分:
player_over_ranks用来给每个球员的每一局生成两个关键值:over_rank:按局号顺序给每个球员的局数排名(比如第1局是1,第2局是2,以此类推)total_overs:统计每个球员一共打了多少局
- 主查询部分:
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,所有局都会被纳入计算)
- 最后按球员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
相关产品推荐
相关产品推荐

