You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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」和「姓名」这两列,点击「转换」选项卡 → 「分组依据」
    • 选择「高级」分组模式,添加两个分组操作:
      1. 操作选「所有行」,新列名可以设为「所有赛事数据」
      2. 操作选「最小值」,列选「成绩」,新列名设为「最佳成绩」
  • 接下来添加自定义列,公式写:
    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:2000: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

火山引擎 最新活动