2016-07-29 3 views
1

У меня есть таблица, в которой я хочу найти лучших людей X в каждой из разных групп.Ранг 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 

Я попал в топ-5 человек по номеру, используя = индекс ($ A $ 2: $ A $ 8, матч (большой ($ B $ 2: $ B $ 8,1), $ B $ 2: $ B $ 8,0)). 1 в функции LARGE, связанной с ранжированным диапазоном, так что, когда я перетащил его, он изменил число.

То, что я хотел бы сделать дальше, это ранжировать верхнее число людей в каждой группе. Итак, верхняя 3 в группе 1.

Я попытался = индекс ($ A $ 2: $ A $ 8, совпадение («1» & большое ($ B $ 2: $ B $ 8,1), $ C $ 2: $ C $ 8 & $ B $ 2: $ B $ 8,0)), но он, похоже, не работает.

Благодаря

EDIT: После глядя на ответы ниже я понял, почему они не работают для меня. Мои фактические данные, которые я хочу использовать формулой, имеют несколько записей чисел. Я скорректировал данные примера, чтобы показать это. Проблема в том, что если есть повторяющиеся числа, то она возвращает оба имени, даже если их нет в группе.

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 Как использование агрегата отличается от большого? Не = large (B3: B7,1) возвращает то же самое, что и = aggregate (14,4, B3: B7,1)? –

+0

@AlexH - разные ссылки на строки в вашей формуле? не должно быть = INDEX ($ A $ 2: $ A $ 8, MATCH (БОЛЬШИЕ ($ B $ 2: $ B $ 8,1), $ B $ 2: $ B $ 8,0))? –

ответ

0

Спасибо всем, кто предложил помощь, но по какой-то причине ни один из методов работал для меня, что я уверен в том, чтобы сделать с качеством моих данных. В конце концов я использовал альтернативный метод, который немного запутан, но, похоже, работал.

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

По существу, используя функцию рангов и добавляя дробь для выделения повторяющихся значений.

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

Вы также могли бы решить эту проблему с формулами массива - фильтровать группу, имя которой хранится в Е1, код

=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

Основываясь на других отличных ответах.

Поскольку у вас есть возможности дублировать значения в каждой группе, нам нужно сделать это с помощью двух формул.

Сначала мы должны получить цифры в порядке. Я использовал агрегат, но это может быть сделано с массивом КРУПНОГО (ЕСЛИ()) также:

=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

+0

Спасибо, Скотт, я работал над подобным подходом и ударился головой о стену. Я только что получил решение D, B, F для группы 2, изначально получал D, A, B. Рад, что вы отправили свой ответ, поскольку я бы бил головой о стену дольше, пытаясь заставить ее соответствовать всем в одной формуле! –

+0

@ForwardEd иногда единственный способ отделить шаги. Это одно. Конечно, всегда есть маршрут vba, который мы могли бы сделать в одном UDF. –

+0

Я собирался упомянуть, что маршрут VBA может быть более легким подходом к этому в предыдущих комментариях, но поскольку VBA не является моим фортом и не может легко создать быстрый код без синтаксической ошибки, я подумал, что лучше всего перейти на второй шаг , Хотя через другие пути я оставил его открытым, чтобы @MacroMan вскочил. –

Смежные вопросы