【问题标题】:Filter to the latest month and then filter to the best score per person过滤到最近一个月,然后过滤到每人的最佳分数
【发布时间】:2016-07-04 12:54:07
【问题描述】:

我有一个包含每月竞赛结果的 Google 表格。格式是

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. 我想创建一个包含最新“最佳”结果的新工作表。对于此处显示的数据,

    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 月份的结果,每人得分为“最佳”。此处删除了 Declan Ham 的低分“390”。

  2. 我想要另一张表来保存锦标赛排名。人们根据他们的前 3 个月得分排名。即获得每个人每个月的最好成绩,并将前 3 名的成绩相结合,以在比赛中占据一席之地。

到目前为止,我已经尝试使用 Google 查询、vlookups、过滤器来获取这些新表格。但是,只关注 1),我所能达到的最好的结果是

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

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

有人对我如何实现这些要求有建议吗?感觉自己现在在踩水。

【问题讨论】:

    标签: google-sheets formulas


    【解决方案1】:

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

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

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

    =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") 
    

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

    锦标赛排名

    在我看来,您的第二个目标对于单个电子表格公式来说太复杂了。不过,这是一种使用多个公式来完成它的方法!

    X 轴和 Y 轴由电子表格公式填写。在 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 中出现的月份记录的最高分的总和。 (在所有参与者和月份中复制并粘贴公式,它会进行调整。)

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

    关于该公式的要点:

    • 查询范围需要使用固定值,以便在复制到其他单元格时不会转置。但是,它仍然是开放式的,可以吸收“结果”表上的额外分数行。

        Results!$A$1:$C
      
    • WHERE 子句用于从Results 工作表中选择给定参与者 (A='"&amp;$A2&amp;"') 的行,并且在列前一个月内 (C$1)。

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

        ...order by C desc limit 3
      
    • 最后,QUERY 标题被这个小技巧抑制了,所以我们得到一个数字作为结果:

        ...label C ''
      

    个人锦标赛总数显示在C 列中,范围为SUM 跨行,例如对于单元格C3

    SUM(D3:3)
    

    那么B列对应的排名是:

    RANK(C3,C$3:C)
    

    整洁

    为了更简单的复制/粘贴,您可以在这些公式中进行一些错误检查,以便它们可以在相应数据出现之前放置在工作表中 - 例如,在您的赛季开始时。使用IF(ISBLANK(...IFERROR(... 对此非常有效。

    • B3 及以下:

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

        =IF(ISBLANK(A3),"",sum(D3:3))
      
    • D3 和其他领域:

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

    【讨论】:

      【解决方案2】:

      或者,对于您问题的第一部分(最新的“最佳”结果),除了 Mogsdad 提供的解决方案之外,这也应该有效.. :-)

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

      编辑:此公式按日期 (col B) 降序和 col C 降序对表进行排序,然后 (ab) 使用 vlookup 仅返回第一个匹配项来返回第一列和最后一列的事实。

      【讨论】:

      • 对我不起作用。我已将其修改为 =ArrayFormula(iferror(vlookup(unique(Results!A1:A), sort(Results!A1:G, 3, 0, 7, 0), {1,7}, 0)))。因为真实数据来自 A:G。但是当我使用这个公式时,它并没有消除在前几个月拍摄但不是最近拍摄的人的重复条目。
      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2015-09-05
      • 2021-02-21
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多