过滤到最近一个月,然后过滤到每个人的最佳分数

Filter to the latest month and then filter to the best score per person

我有一个 Google Sheet,其中包含每月比赛的结果。格式为

Name       | Date       | Score
--------------------------------
Alan Smith | 14/01/2016 | 500
Bob Dow    | 14/01/2016 | 450
Bob Dow    | 16/01/2016 | 470
Clare Allie| 16/01/2016 | 550
Declan Ham | 16/01/2016 | 350
Alan Smith | 10/02/2016 | 490
Bob Dow    | 10/02/2016 | 425
Declan Ham | 12/02/2016 | 400
Declan Ham | 12/02/2016 | 390
Clare Allie| 12/02/2016 | 560

我想用这些数据做两件事

  1. 我想创建一个新的 sheet 来保存最新的 'best' 结果。对于此处显示的数据,将是

    Alan Smith | 10/02/2016 | 490
    Bob Dow    | 10/02/2016 | 425
    Declan Ham | 12/02/2016 | 400
    Clare Allie| 12/02/2016 | 560
    

    即2 月份的结果,每人得分 'best'。此处删除了 Declan Ham 的较低分数“390”。

  2. 我想要另一个sheet来保持锦标赛排名。人们按前 3 个月的得分排名。即获得每个人每个月的最佳成绩,并将前 3 名的成绩相结合,确定他们在比赛中的位置。

到目前为止,我已经尝试使用 Google 查询、vlookup、过滤器来获取这些新的 sheet。但是,只关注 1),我能做到的最好的是

=FILTER(Results!$A:$B, MONTH(Results!$B:$B) = MONTH(MAX(Results!$B:$B)))

这将使我获得最近一个月的结果。但它不会删除人们重复的条目。

有人对我如何实现这些要求有什么建议吗?感觉自己现在如履薄冰

与其尝试删除重复项,不如确定每个人的最高分;您可以通过按人对值进行分组,然后使用 max() 进行聚合来做到这一点。以下是 2016 年 2 月的情况:

=query(Results!A1:C,"select A,max(C) where todate(B) > date '2016-2-1' group by A") 

我们可以使用 spreadsheet 公式获取年份和月份,而不是使用固定值作为最近一个月的开始,并将我们的查询与它们连接起来:

=query(Results!A1:C,"select A,max(C) where todate(B) > date '"&year(max(Results!B2:B))&"-"&month(max(Results!B2:B))&"-1' group by A") 

这解决了您的第一个问题。

锦标赛排名

在我看来,您的第二个目标对于单个传播sheet 公式来说太复杂了。不过,这里有一种使用多个公式来完成它的方法!

X 轴和 Y 轴由展开sheet 公式填充。在 X 轴(橙色)上,我们在单元格 A3:

中使用此填充参与者姓名
=unique(Results!A2:A)

Y 轴由日期(绿色)组成。这些是每个具有分数的唯一月份的开始日期,使用单元格 D2 中的以下公式计算得出。这导致字符串,例如2016-01-1,并且该格式是后面的公式工作所特别需要的。

=TRANSPOSE(SORT(UNIQUE(ARRAYFORMULA(TEXT(Results!B2:B13,"YYYY-MM-1")))))

下面是单元格 D3 的公式,它将计算名字出现在 A3 中的用户在出现在 D2 中的月份的 3 个最高分数的总和. (复制并粘贴整个参与者范围和月份的公式,它会进行调整。)

=sum(query(Results!$A:$C,"select C where A='"&$A2&"' and todate(B) >= date '"&B&"' and todate(B) < date '"&IF(ISBLANK(C),TEXT(TODAY()+1,"yyyy-mm-dd"),C)&"' order by C desc limit 3 label C ''"))

关于该公式的要点:

  • 查询范围需要使用固定值,这样在复制到其他单元格时不会转置。但是,它仍然是 open-ended,以吸收“结果”sheet 上额外的分数行 sheet。

      Results!$A:$C
    
  • WHERE 子句用于 select 来自 Results sheet 的给定参与者的行(A='"&$A2&"' ) 并落在列标题的月份内 (C)。

      ...and todate(B) < date '"&IF(ISBLANK(C),TEXT(TODAY()+1,"yyyy-mm-dd"),C)&"'
    
  • 首先将上述结果降序排列,然后将结果限制为 3 行,找到本月最好的 3 个分数。

      ...order by C desc limit 3
    
  • 最后,QUERYheaders被这个小技巧给压制了,这样我们就得到了一个单数作为结果:

      ...label C ''
    

个人锦标赛总分显示在 C 列中,整个行的范围 SUM,例如对于单元格 C3:

SUM(D3:3)

那么B栏对应的排名是:

RANK(C3,C:C)

整洁

为了更简单 copy/paste,你可以在这些公式中做一些错误检查,这样它们就可以放在相应数据之前的 sheet - 例如,在你的开头季节。使用 IF(ISBLANK(...IFERROR(... 对此非常有效。

  • B3 及以下:

      =IFERROR(RANK(C3,C:C))
    
  • C3 及以下:

      =IF(ISBLANK(A3),"",sum(D3:3))
    
  • D3 & 其余场地:

      =IFERROR(sum(query(Results!$A:$C,"select C where A='"&$A3&"' and todate(B) >= date '"&D&"' and todate(B) < date '"&IF(ISBLANK(E),TEXT(TODAY()+1,"yyyy-mm-dd"),E)&"' order by C desc limit 3 label C ''")))
    

或者你问题的第一部分(最新的 'best' 结果),除了 Mogsdad 提供的解决方案外,这也应该有效.. :-)

=ArrayFormula(iferror(vlookup(unique(A2:A), sort(A2:C, 2, 0, 3, 0), {1,3}, 0)))

编辑:此公式对 table 进行排序,日期(B 列)降序,C 列降序,然后(ab)使用 vlookup 仅 return 与 return 第一列和最后一列。