Google Sheets ArrayFormula - 前行的平均值

Google Sheets ArrayFormula - Avarage values of predecessor rows

我对再次使用 ArrayFormula 有疑问。 我有一个包含 2 列的列表(日期时间和货币)。我需要找到最后 50 行的货币列的平均值。我不能在每一行中使用公式,因为数组的长度可能会有所不同。

我已经尝试过查询(知道它不适用于 ArrayFormula):

=ArrayFormula(query(U2:V; "select AVG(V) where (U > date '"&TEXT(WORKDAY($U139:U;-50); "YYYY-MM-DD")&"' AND U < date '"&TEXT($U139:U; "YYYY-MM-DD")&"') label AVG(V) ''"))

我的下一步是用间接寻址来欺骗它,但这也不起作用:

=ArrayFormula(IF($U2:$U>=$C;AVERAGE(INDIRECT("$V"&ROW()):INDIRECT("$V"&ROW()-50));""))

这是一个包含两个公式的示例 sheet:Avarage 50 example

有什么解决这个问题的想法吗?

既然你说“我需要找到最后 50 行的货币列的平均值”,你可以使用这个:

=ArrayFormula(query({D2:E}; "select AVG(Col2) where (Col1 > date '"&TEXT(WORKDAY($D139:D;-50); "YYYY-MM-DD")&"' AND Col1 < date '"&TEXT($D139:D; "YYYY-MM-DD")&"') label AVG(Col2) ''"))

但是你说“我需要在 50 个前行的每一行中使用这个而不复制公式”,所以这是我能想到的将公式放在一个单元格中的最佳方式:

={query({C2:C};"where Col1 is null limit 49";0);query(ARRAYFORMULA(if(E2:E="";"";(E2:E+E3:E+E4:E+E5:E+E6:E+E7:E+E8:E+E9:E+E10:E+E11:E+E12:E+E13:E+E14:E+E15:E+E16:E+E17:E+E18:E+E19:E+E20:E+E21:E+E22:E+E23:E+E24:E+E25:E+E26:E+E27:E+E28:E+E29:E+E30:E+E31:E+E32:E+E33:E+E34:E+E35:E+E36:E+E37:E+E38:E+E39:E+E40:E+E41:E+E42:E+E43:E+E44:E+E45:E+E46:E+E47:E+E48:E+E49:E+E50:E+E51:E)/50));"limit "&counta(E2:E)-49&" ";0)}

注意:公式必须在第 2 行!!在其他任何地方,它可能会导致您 sheet 添加更多行时出现问题。

要使 query({C2:C};"where Col1 is null limit 49";0) 正确工作并偏移数组公式,您必须至少有 49 个空白单元格。如果不是,请引用不同的列。

由于您的示例 sheet 位于德国,我不得不使用 ;而不是 , 作为函数分隔符。

更新

如果您创建一个名为 'RowsToAverage' 的命名范围,其中包含您想要平均的行数(即 50),这里是一个修改后的公式:

={query({C2:C};"where Col1 is null limit "&RowsToAverage-1&"";0);query(ARRAYFORMULA(if(E2:E="";"";(E2:E+E3:E+E4:E+E5:E+E6:E+E7:E+E8:E+E9:E+E10:E+E11:E+E12:E+E13:E+E14:E+E15:E+E16:E+E17:E+E18:E+E19:E+E20:E+E21:E+E22:E+E23:E+E24:E+E25:E+E26:E+E27:E+E28:E+E29:E+E30:E+E31:E+E32:E+E33:E+E34:E+E35:E+E36:E+E37:E+E38:E+E39:E+E40:E+E41:E+E42:E+E43:E+E44:E+E45:E+E46:E+E47:E+E48:E+E49:E+E50:E+E51:E)/RowsToAverage));"limit "&counta(E2:E)-(RowsToAverage-1)&" ";0)}

您仍然需要手动创建范围 (E2:E+E3:E+E4:E+E5:E+E6:E+E7:E+E8:E+E9:E+E10:E+E11:E+E12:E+E13:E+E14:E+E15:E+E16:E+E17:E+E18:E+E19:E+E20:E+E21:E+E22:E+E23:E+E24:E+E25:E+E26:E+E27:E+E28:E+E29:E+E30:E+E31:E+E32:E+E33:E+E34:E+E35:E+E36:E+E37:E+E38:E+E39:E+E40:E+E41:E+E42:E+E43:E+E44:E+E45:E+E46:E+E47:E+E48:E+E49:E+E50:E+E51:E),但他可以在另一个单元格中轻松完成,然后复制到上面的公式中:

=textjoin("+";true;arrayformula("E"&row(indirect("A2:A"&RowsToAverage+1))&":E"))

MMULT() 可用于创建这样的条件平均值或求和,但它们仅限于 2500 行左右的数据集,因为它们实际上会创建一个 N 行长、N 列宽的矩阵,其中 N 是数据集的长度。

N^2 必须小于大约 500 万,因为这是 google 工作表中的“单元格限制”。

您将在名为 MK.Help:

的新选项卡上的单元格 F2 中找到此公式
=ARRAYFORMULA(IF((E2:E="")+(ROW(D2:D)<50+1);;MMULT((ROW(D2:D)<=TRANSPOSE(ROW(D2:D)+50))*(ROW(D2:D)>=TRANSPOSE(ROW(D2:D)));N(E2:E))/50))