2016-07-29 22 views
1

我有一张表,我想找到每个不同组别的前X位的人。 $ A $ 8,匹配(大($ B $ 2:$ B $ 8,1),$ B $ 2:$按不同标准排名前5的条目

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 

我已经通过使用=指数($ A $ 2排名前5人通过数B $ 8,0))。我把LARGE函数中的1连接到了一个排列的范围,这样当我拖下时它就改变了数字。

接下来我想要做的是在每组中排名前几位的人数。因此,第1组中的前三名。

我试过=索引($ A $ 2:$ A $ 8,匹配(“1”&大($ 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 
+0

我会看看聚合命令功能14我认为这是 –

+0

@ForwardEd如何使用聚合不同于大?不是=大(B3:B7,1)返回相同=聚合(14,4,B3:B7,1)? –

+0

@AlexH是您公式中有意识的不同行引用? ($ B $ 2:$ B $ 8,1),$ B $ 2:$ B $ 8,0))? –

回答

0

谢谢大家谁提供帮助,但没有你的方法的一些原因为我工作,我确信是我的数据的质量做。我最后使用了一种替代方法,这个方法有些复杂但似乎有效。

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

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

2

证明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编号进行复制。

说明:

不像大功能集合函数是无需使用CSE数组函数。因此,我们可以将标准添加到我们想要使用的标准中。在这种情况下,只使用了1个标准,那就是组号。公式中是以下部分:

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

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

聚合函数中的6选项允许我们忽略错误。这在尝试获得小的时候很有用。处理可能导致不需要担心的错误的其他信息也很有用。

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

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

+0

注意:并非所有的AGGREGATE子函数都是数组函数。 14和15是肯定的,其余的我不确定。 –

+0

不幸的是,这并没有奏效。你知道它不起作用的原因吗?据我所知,我的实际数据与我给你的样本数据没有多大区别,除了大得多。它没有空白。 –

+0

确保您的范围的长度匹配。即A2:A1500应该与B2:B1500相同,或者也可以使用A1:A10和B11:B20。每个范围中的行数需要相等。 –

1

你也可以用数组公式解决这个问题 - 过滤一群人的名称存储在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)) 

注:输入后数组公式,您按CTRL + SHIFT + ENTER。

+0

注意:这与@ForwardEd的建议基本相同,但较为复杂。 –

+0

相似但不完全相同。你很紧凑,我真的很喜欢。减少错别字的机会。在我看来,聚合函数的优点是你可以获得数组类似的计算,而不受CSE {}调整单元格范围的限制。 –

2

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

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

首先我们需要按顺序获取数字。我用了总结,但是这可能与阵列LARGE(IF()),也可以做:

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

然后使用该号码,以便大家可以参考一下,我们可以使用@转发公式的修改版本,使用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)),"") 

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

enter image description here

+0

谢谢斯科特,我正在研究类似的方法,并将我的头撞在墙上。我刚刚得到了第2组的D,B,F解决方案,最初是得到D,A,B。很高兴你发布了你的答案,因为我一直在试图让它适合所有的一个公式,所以我一直在头撞墙! –

+0

@ForwardEd有时唯一的办法是分开步骤。这是一。当然,总是有vba路线,我们可以在一个UDF中做到这一点。 –

+0

我刚才提到VBA路线可能是这个备份在最初评论中的更容易的方法,但由于VBA不是我的优势,并且无法轻松生成没有语法错误的快速代码,所以我认为最好是在步骤。尽管通过其他途径,我确实将其开放给@MacroMan加入。 –