按不同标准排名前5个条目

时间:2016-07-29 10:48:49

标签: excel

我有一张桌子,我希望在每个不同的小组中找到前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,匹配(大($ B $ 2:$ B $ 8,1),$ B $ 2:$ B $ 8)按编号排名前5位,0))。 LARGE函数中的1我链接到一个排名范围,这样当我向下拖动时它改变了数字。

接下来我要做的是对每组中排名前x的人数进行排名。因此,第1组中排名前3位。

我试过=索引($ A $ 2:$ A $ 8,匹配(" 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

4 个答案:

答案 0 :(得分: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号码,在你复制时提出一个增加和重置组号的公式。

说明:

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

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

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

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

从技术上讲,这是一个数组操作,避免使用完整的列/行引用,因为它们可能会使系统陷入困境。

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

答案 1 :(得分:2)

以所有其他伟大答案为基础。

因为你有可能在每个组中重复值,我们需要使用两个公式。

首先,我们需要按顺序获取数字。我使用了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)),"")

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

enter image description here

答案 2 :(得分: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。

答案 3 :(得分:0)

感谢所有提供帮助的人,但由于某些原因,您的方法都不适用于我,我确信这与我的数据质量有关。我最后使用了一种替代方法,这种方法有点复杂,但似乎有效。

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

基本上使用秩函数并添加分数来分离重复值。