如何用Excel获取跑步赛事系列选手最佳成绩及多赛事筛选结果
嘿,这两个跑步成绩处理的问题我熟,都是Excel里的常见需求,分情况给你捋清楚:
处理两场赛事:提取每位选手的最佳成绩及对应完整数据
先得看看你的成绩列表是哪种结构,我分两种最常见的情况给你方案:
情况1:长表结构(每行一条赛事成绩记录)
比如你的数据是这种样式:
| 选手ID | 姓名 | 赛事名称 | 成绩 |
|---|---|---|---|
| 101 | 张三 | 春季赛 | 00:35:20 |
| 101 | 张三 | 夏季赛 | 00:34:15 |
| 102 | 李四 | 春季赛 | 00:36:00 |
| 103 | 王五 | 夏季赛 | 00:33:50 |
这种情况用Power Query就最方便啦,步骤超清晰:
- 选中你的数据区域,点击「数据」选项卡 → 「从表格/区域」(记得勾选“我的表格有标题”哦)
- 进入Power Query编辑器后,选中「选手ID」和「姓名」这两列,点击「转换」选项卡 → 「分组依据」
- 选择「高级」分组模式,添加两个分组操作:
- 操作选「所有行」,新列名可以设为「所有赛事数据」
- 操作选「最小值」,列选「成绩」,新列名设为「最佳成绩」
- 选择「高级」分组模式,添加两个分组操作:
- 接下来添加自定义列,公式写:
这一步就是把该选手对应最佳成绩的那条完整记录筛选出来Table.SelectRows([所有赛事数据], each [成绩] = [最佳成绩]) - 最后展开这个自定义列,删掉没用的中间列,加载回Excel就搞定了
如果不想用Power Query,用函数公式也能实现:
假设数据在A2:D100区域,在E2单元格输入公式拿到最佳成绩:
=INDEX($D$2:$D$100,MATCH(MINIFS($D$2:$D$100,$A$2:$A$100,A2),$D$2:$D$100,0))
再用XLOOKUP匹配对应的赛事名称:
=XLOOKUP(E2,$D$2:$D$100,$C$2:$C$100,"",0,1)
(如果有多个相同的最佳成绩,这个公式会返回第一条匹配的记录)
情况2:宽表结构(每个选手一行,两场成绩在同一行)
比如数据是这种样式:
| 选手ID | 姓名 | 春季赛成绩 | 夏季赛成绩 |
|---|---|---|---|
| 101 | 张三 | 00:35:20 | 00:34:15 |
| 102 | 李四 | 00:36:00 | |
| 103 | 王五 | 00:33:50 |
这种结构处理起来更简单,用IF+MIN组合就行:
- 在
E2单元格计算最佳成绩:
(空值会被自动忽略,只参加一场的选手会直接显示那场的成绩)=MIN(C2,D2) - 在
F2单元格显示对应赛事名称:
这样就能直接拿到每位选手的最佳成绩及对应赛事的完整信息了=IF(C2=E2,"春季赛",IF(D2=E2,"夏季赛",""))
新增第三场赛事后:筛选每位选手的最佳两场成绩
当新增第三场赛事后,不管是长表还是宽表,都有对应的高效处理方法:
长表结构(每行一条成绩)
还是Power Query最省心,步骤调整一下就行:
- 进入Power Query编辑器,选中「选手ID」和「姓名」列,点击「分组依据」→ 高级
- 添加分组操作:操作选「所有行」,新列名设为「所有赛事数据」
- 添加自定义列,先按成绩升序排序(跑步成绩时间越短越好):
Table.Sort([所有赛事数据],{{"成绩", Order.Ascending}}) - 再添加一个自定义列,取排序后的前两行(也就是最佳的两场):
Table.FirstN([自定义],2) - 最后展开这个新列,加载回Excel,就是每位选手最佳两场成绩的完整数据了
如果用公式的话,需要用RANK.EQ给每个选手的成绩单独排名,再筛选排名≤2的记录:
假设数据在A2:D100(D列是成绩),在E2单元格输入排名公式:
=RANK.EQ(D2,$D$2:$D$100*(A2=$A$2:$A$100),1)
这个公式会给每个选手的成绩单独排名(1是最好的),然后筛选E列≤2的行,就是每位选手的最佳两场成绩了
宽表结构(每个选手一行,三场成绩在同一行)
假设新增了「秋季赛成绩」列(E列),要选出最佳的两个成绩,用SMALL函数就行:
- 提取第一好的成绩:
=SMALL(C2:E2,1) - 提取第二好的成绩:
=SMALL(C2:E2,2)
如果要显示对应的赛事名称,用INDEX+MATCH结合SMALL:
- 第一好的赛事名称:
=INDEX($C$1:$E$1,MATCH(SMALL(C2:E2,1),C2:E2,0)) - 第二好的赛事名称:
=INDEX($C$1:$E$1,MATCH(SMALL(C2:E2,2),C2:E2,0))
这样就能拿到最佳两场的成绩和对应的赛事信息了
内容的提问来源于stack exchange,提问作者Damien Jones




