Окончательная версия (гибкие параметры даты и определенные имена)
С помощью функции массива (поэтому вы должны ввести ее с помощью 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
, это не влияет на результат, поэтому я не сделал формулу слишком сложной, чтобы сохранить только совпадающие даты в массивах.