过滤到最近一个月,然后过滤到每个人的最佳分数
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
我想用这些数据做两件事
我想创建一个新的 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”。
我想要另一个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
最后,QUERY
headers被这个小技巧给压制了,这样我们就得到了一个单数作为结果:
...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 第一列和最后一列。
我有一个 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
我想用这些数据做两件事
我想创建一个新的 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”。
我想要另一个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
最后,
QUERY
headers被这个小技巧给压制了,这样我们就得到了一个单数作为结果:...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 第一列和最后一列。