我有一个正在进行的比赛的得分电子表格。根据相应值的图表,将竞争对手的位置/排名转换为整个系列的积分。对于平局,所有平局席位所涵盖的积分之和在平局竞争对手之间平均分配(例如,两局并列为三局;如果第三局通常获得10分,第四局通常获得8分,则这些竞争者将获得(10+ 8)/ 2(2是并列的竞争对手的数目),因此他们每个人都得到9分。 我有一个公式可以执行此精确计算:
=IFERROR(IF(ISBLANK($A4:$A),,SUM(INDEX(SeriesPoints, E4:E):INDEX(SeriesPoints, MIN(E4:E + COUNTIF(E$4:E, E4:E) - 1, ROWS(SeriesPoints)))) / COUNTIF(E$4:E, E4:E), 0))
其中“ SeriesPoints”是2列数组;第1列是位置/等级(1:125),第2列是其对应的点值。 “ E”列是竞争对手的排名。
我一直无法将此公式转换为ARRAYFORMULA(),因此我可以避免将其拖到整张纸上(整个系列最多有1000多个竞争对手)。 我对MMULT()有一定的了解,所以我知道这是切换SUM()的好方法,但是,我无法创建要求和的值的矩阵。 INDEX():INDEX()无法与ARRAYFORMULA()一起使用,因此我尝试切换到VLOOKUP()。使用VLOOKUP(),我可以生成平局值范围的开始和结束值,但不能生成完整列表。例如,如果有一个四分之三的平局,我可以分别产生第4和第6点(平局的边界)的点。 为了只列出4:6中的数字,我碰到了一堵墙,将简单的ROW()或SEQUENCE()公式转换为矩阵/数组。
以下公式将生成领带上下限的数组,或者如果没有领带,则将单个位置重复放置。
=ARRAYFORMULA(IF(COUNTIF(E$4:E,E4:E)=1,E4:E,{E4:E,E4:E+COUNTIF(E$4:E,E4:E)-1}))
我假设我可以让VLOOKUP({#:#})正确填充,那么我将在需要的地方。 从这里开始,我对包装VLOOKUP()作为实际点值,MMULT()在这些行中求和以求总,然后进行简单除法以产生正确的点值的能力充满信心。
电子表格:https://docs.google.com/spreadsheets/d/1lpNewR3p4i7ZHmlFGLlG1tLuxgO-6onSeH8mWTeclBw/edit?usp=sharing 目前,我的工作区位于右侧。原始公式在F4中,我的测试代码在G列而不是E上工作。
所以对于1,1,3,3,3,6,7,8的样本放置以及1000、850,738,663,633,603,573,550的样本点值,我期望两个并列第1的竞争对手的输出为925,并列第678的输出第三名,第六名603,第七名573,第八名550。
我将不胜感激!
答案 0 :(得分:0)
=ARRAYFORMULA(IFERROR(IFERROR(VLOOKUP(G4:G, QUERY({INDIRECT("G4:G"&counta(A4:A)+3),
VLOOKUP(ROW(INDIRECT("A1:A"&COUNTA(A4:A))), SeriesPoints, 2, 0)},
"select Col1,sum(Col2) group by Col1 label sum(Col2)''", 0), 2, 0))/
IFERROR(VLOOKUP(G4:G, QUERY(G4:G,
"select G,count(G) where G is not NULL group by G label count(G)''", 0), 2, 0))))