Среднее из четырех дат с несколькими критериями - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть два листа Excel.На листе 1 есть следующие записи:

Salon          coach       date         amount
Sal1           col1       11/7/2018     500
Sal1           col1       11/1/2018     400
Sal1           col1       10/25/2018    600
Sal1           col1       10/19/2018    700
Sal1           col1       10/1/2018     250
And so on

На листе 2 имеются следующие данные и записи:

Salon         coach       average of lastest 4 dates
Sal1          col1                       ???

Я хочу найти среднюю сумму за четыре последние даты, исключая самые последниеДата.Расчет должен начинаться со 2-й самой поздней даты до 5-й самой поздней даты с соответствием критериям салона и тренера.

enter image description here

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Окончательная версия (гибкие параметры даты и определенные имена)

С помощью функции массива (поэтому вы должны ввести ее с помощью Ctrl + Shift + Enter) и с именованными диапазонами, чтобы сделать формулу более понятной:

{=AVERAGE(IF(
     (r_salon=A14)*
     (r_coach=B14)*
     (r_date>=LARGE(IF((r_salon=A14)*(r_coach=B14);r_date;);
                    MIN(d_last;COUNTIFS(r_salon;A14;r_coach;B14))))*
     (r_date<=LARGE(IF((r_salon=A14)*(r_coach=B14);r_date;);
                    MIN(d_first;COUNTIFS(r_salon;A14;r_coach;B14))));
      r_amount))} 

Для тестирования я поместил формулу на тот же лист, что и данные, поэтому Sal1 находится в ячейке A14, а col1 в ячейке B14.

Объяснение формулы (чтобы вы могли подстроить ее при необходимости):

  • Два внутренних IF создают массив всех дат для Sal1 и col1 (ячейки A14 и B14), а функции LARGE вокруг него принимают n-е наибольшее значение; n фактически рассчитывается как минимум d_first или d_last соответственно и числа дат / строк, фактически присутствующих для комбинации sal1 / col1 (это позаботится о случае, который для некоторого салона / Комбинация (и) тренера может быть меньше, чем d_first или d_last даты;
  • Затем внешний IF создает массив всех дат, соответствующих всем критериям, т. Е. Для Sal1 И col1 И после d_first И до d_last (рассчитывается с внутренним IF на предыдущем шаге); * является сокращением для оператора AND, который также работает для формул массива (AND не работает);
  • AVERAGE, конечно, тривиально.

Чтобы сделать формулу более гибкой, я использовал два параметра (определенные имена): d_first - самая последняя дата, которую вы хотите включить, и d_last - последняя дата, которую вы хотите включить. Некоторые примеры:

  • d_first=2 и d_last=5: чтобы ответить на ваш актуальный (обновленный) вопрос, т. Е. В среднем за 4 даты, начиная со 2-го самого последнего до 5-го самого последнего;
  • d_first=1 и d_last=4: это то же самое, что и первая версия ответа, т. Е. Результатом будет среднее значение за 4 самых последних даты;
  • d_first=2 и d_last=4: это будет среднее значение от 2-й самой последней даты до 4-го;
  • d_first=1 и d_last=1: это просто приведет к самой последней дате (среднее значение для одного значения - только само значение).

Вам просто нужно убедиться, что d_first является положительным целым числом (больше нуля), а d_last должно быть больше или равно d_first. Если они превышают общее число дат в наборе данных, результатом является значение, соответствующее самой ранней дате.

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

Версия 2 (добавление большей гибкости)

Формула:

{=AVERAGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14)*($C$2:$C$11>=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(d_last;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))))*($C$2:$C$11<=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(d_first;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))));$D$2:$D$11))}

Версия 1 (оригинальный вопрос, то есть среднее из последних 4 дат; это не имеет значения, поскольку вопрос был обновлен)

Это можно сделать с помощью следующей формулы массива (поэтому вы должны ввести ее с помощью ctrl + shift + enter):

{=AVERAGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14)*($C$2:$C$11>=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(4;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))));$D$2:$D$11))}

Примечание
( только для справки, и в случае, если вы отлаживаете формулу с помощью F9 и проверяете различные промежуточные результаты массива )
Массивы не только содержат значения, которые удовлетворяют условию (ам), но и будут иметь тот же размер, что и аргумент IF (т.е. будут иметь столько же значений, сколько строк в вашем наборе данных), и заполнены FALSE для строк, которые не соответствуют условию (ам). Поскольку функция AVERAGE (как и многие другие) не учитывает значения FALSE, это не влияет на результат, поэтому я не сделал формулу слишком сложной, чтобы сохранить только совпадающие даты в массивах.

0 голосов
/ 08 ноября 2018

enter image description here

Ну, этот должен работать. Я надеюсь, что проверил это для всех возможных сценариев.

 =SUMPRODUCT(
 (Table1[Salon]=G5)*(Table1[coach]=H5)*
 (Table1[date]>=LARGE(((Table1[Salon]=G5)*(Table1[coach]=H5)*(Table1[date])),5))*
 (Table1[date]<=LARGE(((Table1[Salon]=G5)*(Table1[coach]=H5)*(Table1[date])),2))*
 Table1[amount])/4

Дайте мне знать, как это работает для вас.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...