修正SQL计算指定轮次Chelsea客场失球平均值的逻辑需求
切尔西客场特定轮次失球平均值计算问题
需求
仅计算切尔西(Chelsea)作为客场球队(team_away=Chelsea)在第1轮、第2轮比赛中的失球平均值,其中失球数对应数据表中的score_home字段(主队进球数即客队失球数)。
现有问题
原代码使用LIMIT 2限制记录,存在两个核心问题:
- 错误选取了切尔西最近的2场客场比赛(如示例中的第5、4轮),而非指定的第1、2轮;
- 即便筛选到目标轮次,原逻辑的
AVG计算不符合要求——需要仅以实际符合轮次条件的记录数作为除数,而非所有切尔西客场记录数。
计算规则
- 若切尔西仅在第1轮客场:平均值 = 该轮
score_home/ 1 - 若切尔西仅在第2轮客场:平均值 = 该轮
score_home/ 1 - 若两轮均为客场:平均值 = (第1轮
score_home+ 第2轮score_home) / 2 - 若两轮均非客场:不计算平均值(返回空值)
现有错误代码
cursor_test.execute(""" SELECT AVG(score_home) FROM (SELECT score_home FROM Results WHERE team_away=? ORDER BY round DESC LIMIT 2;) """,(Team_Away))
示例数据表
| id | round | team_home | team_away | score_home | score_away |
|---|---|---|---|---|---|
| 5 | Liverpool | CHELSEA | 3 | 2 | |
| 4 | United | CHELSEA | 0 | 1 | |
| 3 | Leeds | Brighton | 1 | 3 | |
| 2 | Tottenham | CHELSEA | 2 | 2 | |
| 1 | Arsenal | Fulham | 2 | 0 |
修正后的代码(适配未来新增轮次)
# 定义需要统计的轮次,未来新增轮次只需修改此列表 target_rounds = (1, 2) # 生成对应数量的占位符,适配SQL语法 placeholders = ', '.join(['?'] * len(target_rounds)) cursor_test.execute(f""" SELECT AVG(score_home) FROM Results WHERE team_away = ? AND round IN ({placeholders}) """, (Team_Away,) + target_rounds)
代码说明
- 通过
round IN ({placeholders})精准筛选指定轮次的记录,避免了LIMIT带来的错误选取问题; AVG()函数会自动适配符合条件的记录数:- 若有1条符合记录,除数为1;
- 若有2条符合记录,除数为2;
- 若无符合记录,返回
NULL,即不计算平均值;
- 新增轮次时,只需修改
target_rounds列表即可,无需改动SQL核心逻辑,满足可扩展性要求。
内容的提问来源于stack exchange,提问作者Evangelos Dellas
相关产品推荐
相关产品推荐

