使用 google 表格 arrayformula 从一定时间范围内的每一天获取最大值
Get max value from each day from a range of time using google sheets arrayformula
范围 A 存储时间及其值,并且会动态更新(示例中没有)。
从那个范围 A,我想制作一个每天的动态范围 B 及其最大值。
Filter() 不适用于 arrayformula,我不知道查询是否也适用。
你可以试试这个(在 Excel 上测试过,因为你的 Google Sheet 被阻止了,但它应该可以正常工作)
=SUMPRODUCT(MAX(--($A:$A>D5)*--($A:$A<D5+1)*$B:$B))
这是它的工作原理:
如果单元格值高于日期引用,--($A:$A>D5)
将 return 为 1 和 0 的数组。假设日期参考是 24/01/2020,那么 returned 数组将是 {1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1}
--($A:$A<D5+1)
会做同样的事情,但前提是单元格值低于 d5+1(第二天)。因此,对于 24/01/2020,我们将获得 {1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
- 首先
*
将两个数组相乘,所以{1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1} * {1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0} = {1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
- 第二个
*
会将前一个数组乘以 B5:B31
范围内的值,这意味着 {1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0} * {0,333;0,667;0,667;0,667;0,667;0,667;0,667;0,667;0,667;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0,667} = {0,333;0,667;0,667;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
MAX
将从上一个数组中获取 max 值(在本例中,0,667
)
SUMPRODUCT
已添加,因此我们可以使用数组。 Normal Max自己是不会做的
注意:请注意,我的小数点分隔符是逗号,参数分隔符是分号,因此您可能需要根据您的语言设置来修复此问题
您只需查询即可:
=ArrayFormula(query({int(A4:A),B4:B},"select Col1,max(Col2) where Col2 is not null group by Col1 label Col1 'Date'"))
只要您适当地格式化结果中的日期列。
编辑
要删除列标签,只需输入一个空字符串,如下所示:
=ArrayFormula(query({int(A4:A),B4:B},"select Col1,max(Col2) where Col2 is not null group by Col1 label Col1 '',max(Col2) ''"))
范围 A 存储时间及其值,并且会动态更新(示例中没有)。
从那个范围 A,我想制作一个每天的动态范围 B 及其最大值。
Filter() 不适用于 arrayformula,我不知道查询是否也适用。
你可以试试这个(在 Excel 上测试过,因为你的 Google Sheet 被阻止了,但它应该可以正常工作)
=SUMPRODUCT(MAX(--($A:$A>D5)*--($A:$A<D5+1)*$B:$B))
这是它的工作原理:
-
如果单元格值高于日期引用,
--($A:$A>D5)
将 return 为 1 和 0 的数组。假设日期参考是 24/01/2020,那么 returned 数组将是{1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1}
--($A:$A<D5+1)
会做同样的事情,但前提是单元格值低于 d5+1(第二天)。因此,对于 24/01/2020,我们将获得{1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
- 首先
*
将两个数组相乘,所以{1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1} * {1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0} = {1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
- 第二个
*
会将前一个数组乘以B5:B31
范围内的值,这意味着{1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0} * {0,333;0,667;0,667;0,667;0,667;0,667;0,667;0,667;0,667;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0,667} = {0,333;0,667;0,667;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
MAX
将从上一个数组中获取 max 值(在本例中,0,667
)SUMPRODUCT
已添加,因此我们可以使用数组。 Normal Max自己是不会做的
注意:请注意,我的小数点分隔符是逗号,参数分隔符是分号,因此您可能需要根据您的语言设置来修复此问题
您只需查询即可:
=ArrayFormula(query({int(A4:A),B4:B},"select Col1,max(Col2) where Col2 is not null group by Col1 label Col1 'Date'"))
只要您适当地格式化结果中的日期列。
编辑
要删除列标签,只需输入一个空字符串,如下所示:
=ArrayFormula(query({int(A4:A),B4:B},"select Col1,max(Col2) where Col2 is not null group by Col1 label Col1 '',max(Col2) ''"))