按照不同的标准排列前5名

我有一张桌子,我想find每个不同组别的前X名。

Unique Names Number Group a 30 1 b 4 2 c 19 3 d 40 2 e 1 1 f 9 2 g 15 3 

我通过使用= index($ A $ 2:$ A $ 8,match(large($ B $ 2:$ B $ 8,1),$ B $ 2:$ B $ 8,0))按数字排名前五名。 LARGE函数中的1与链接到一个排列的范围,所以当我拖下来它改变了数字。

接下来我要做的就是在每个组中排名前几位的人数。 所以在组1中排名前三。

我试过= index($ A $ 2:$ A $ 8,match(“1”&large($ B $ 2:$ B $ 8,1),$ C $ 2:$ C $ 8&$ B $ 2:$ B $ 8,0))但似乎没有工作。

谢谢

编辑:在看下面的答案后,我已经意识到为什么他们不为我工作。 我想要使​​用公式的实际数据具有多个数字条目。 我已经调整了示例数据来显示这一点。 我遇到的问题是,如果有重复的号码,则即使不在组中,也会返回两个名称。

  Unique Names Number Group a 30 1 b 30 2 c 19 3 d 40 2 e 1 1 f 30 2 g 15 3 

概念validation

POC

在上面的F2单元格中使用以下公式,并根据需要向下复制并向右移动。

 =IFERROR(INDEX($A$2:$A$8,MATCH(AGGREGATE(14,6,($C$2:$C$8=F$1)*($B$2:$B$8),ROW($A2)-1),$B$2:$B$8,0)),"") 

在标题行中提供组号码。 或者提出一个公式来增加和重置组号码,当你根据你的问题中的X号码复制下来。

说明:

与大函数不同,AGGREGATE函数是一个数组函数,不需要使用CSE。 因此,我们可以添加我们想要使用的标准。 在这种情况下,只使用了一个标准,那就是组号。 在公式中是以下部分:

 ($C$2:$C$8=F$1) 

如果有多个标准,我们会使用一个+运算符作为OR,或者我们会使用一个*运算符作为AND。

聚合函数中的6选项允许我们忽略错误。 这是有用的,当试图得到小。 处理可能导致错误的其他信息也是有用的,这些信息不需要担心。

因为这在技术上是一个数组操作,所以避免使用完整的列/行引用,因为它们可能会导致系统崩溃。

整个公式所做的基础是build立一个匹配你感兴趣的组号的列表。在过滤你的数字之后,它会根据你已经复制到哪一行来确定哪一个是最大的,第二大的。 然后通过匹配函数确定出现第n个最大数的行,最后返回到具有索引函数的那个​​行的对应名称。

build立在所有其他伟大的答案。

因为在每个组中都有重复值的可能性,所以我们需要用两个公式来做到这一点。

首先,我们需要按顺序获得数字。 我使用了Aggregate,但是也可以使用LARGE(IF())数组来完成:

 =IFERROR(AGGREGATE(14,6,$B$2:$B$8/($C$2:$C$8=E$1),ROW(1:1)),"") 

然后使用这个数字和顺序我们可以引用,我们可以使用@ ForwardEd公式的修改版本,使用COUNTIF()来确保我们得到正确的名字作为回报。

 =IFERROR(INDEX($A$2:$A$8,AGGREGATE(15,6,(ROW($B$2:$B$8)-ROW($B$2)+1)/(($C$2:$C$8=F$1)*($B$2:$B$8=E3)),COUNTIF(E$2:E2,E3)+1)),"") 

这将计算返回结果中的数字,然后input正确的名称。

在这里输入图像说明

你也可以用数组公式来解决这个问题 – 过滤名称存储在E1中的组

 =INDEX($A$2:$A$8,MATCH(LARGE($B$2:$B$8,1),$B$2:$B$8,0)) 

然后将适应

 =INDEX($A$2:$A$8,MATCH(LARGE(IF($C$2:$C$8<>E1,-1,$B$2:$B$8),1),$B$2:$B$8,0)) 

注意:input数组公式后,按CTRL + SHIFT + ENTER。

感谢所有提供帮助的人,但是由于某种原因,你们的方法都不适合我,我相信这一切都与我的数据质量有关。 我最后使用了一种替代方法,这个方法有点复杂,但似乎工作。

 =IF($C2="1",RANK($B2,$B$2:$B$8,1)+ROW()/10000,-1) 

本质上使用rank函数并添加一个分数来分离出重复的值。