最终版本(灵活的日期参数和定义的名称)
使用数组函数(因此您必须使用 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 然后创建一个包含所有满足所有条件的所有日期的数组,即d_first 之后的 Sal1 AND col1 AND 在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 值,因此这对结果没有影响,因此我没有使公式过于复杂以仅保留数组中的匹配日期。