过滤到最近一个月,然后过滤到每人最高分

时间:2016-07-04 12:54:08

标签: google-sheets formulas

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

  string code = "FFDDAA";

  Color color = Color.FromArgb(Convert.ToInt32(code, 16));

我想用这些数据做两件事

  1. 我想创建一个包含最新“最佳”结果的新工作表。对于此处提供的数据

    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
    

    即。 2月的结果是每人“最佳”得分。在这里,Declan Ham的低分“390”被删除了。

  2. 我想要另一张表来保持锦标赛排名。人们按其前3个月的分数排名。即获得每个人每个月的最高分,并将前三个分数合并在一起,以便在比赛中占据一席之地。

  3. 到目前为止,我已尝试使用Google查询,vlookup,过滤器来获取这些新工作表。但是,只关注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 个答案:

答案 0 :(得分: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") 

screenshot

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

锦标赛排名

在我看来,对于单个电子表格公式,您的第二个目标过于复杂。不过,这是使用多个公式实现它的方法!

screenshot

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中显示的用户记录的3个最高得分的总和,显示在{{1}中的月份}}。 (将公式复制并粘贴到所有参与者和几个月,并进行调整。)

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)的行,并且落在列的前一个月内({ {1}})。

    A='"&$A2&"'
  • 通过首先将上述结果降序排序,然后将结果限制为3行,可以找到本月最佳的3个分数。

    C$1
  • 最后,...and todate(B) < date '"&IF(ISBLANK(C$1),TEXT(TODAY()+1,"yyyy-mm-dd"),C$1)&"' 标题被这个小技巧所抑制,因此我们得到一个数字作为结果:

    ...order by C desc limit 3
    

单个锦标赛总计显示在QUERY列中,整行中的...label C '' 范围,例如对于单元格C

SUM

C3中的相应排名是:

SUM(D3:3)

整理

为了更简单的复制/粘贴,您可以在这些公式中进行一些错误检查,以便它们可以在相应数据之前放置在工作表中 - 例如,在您的季节开始时。使用BRANK(C3,C$3:C) 对此非常有效。

  • B3&amp;下:

    IF(ISBLANK(...
  • C3&amp;下:

    IFERROR(...
  • D3&amp;其他领域:

    =IFERROR(RANK(C3,C$3:C))
    

答案 1 :(得分:0)

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

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

enter image description here

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