既然你说“我需要找到最后 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 行!在其他任何地方,它可能会导致您的工作表添加更多行时出现问题。
要使query({C2:C};"where Col1 is null limit 49";0) 正常工作并偏移数组公式,您必须至少有 49 个空白单元格。如果不是,请参考其他列。
由于您的样本表位于德国,因此我不得不使用 ;而不是 , 作为函数分隔符。
更新
如果您创建一个名为“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"))