ArrayFormula,Google电子表格

时间:2013-08-14 05:31:12

标签: google-sheets

这似乎是一个我无法解决的简单问题。我有以下公式(工作正常)。

=MEDIAN(FILTER('Filtered-Data'!$D$4:$D,'Filtered-Data'!$C$4:$C=B3))

我想要的是使用ArrayFormula获取范围B3:B的列式结果,而不仅仅是B3

可以这样做吗?

1 个答案:

答案 0 :(得分:0)

第一个想法是使用Google QUERY函数,但它不支持标准SQL SELECT ... WHERE... IN (valA,valB...)子句。但是你需要的东西是ARRAYFORMULA可以实现的。诀窍是适当匹配两列,处理错误,并应用适当的过滤(多线条以便于阅读):

=MEDIAN(FILTER(Filtered-Data'!$D$4:$D,
  ARRAYFORMULA(IF(IFERROR(MATCH
   (Filtered-Data'!$D$4:$D,'Filtered-Data'!$C$4:$C=B3:B,0),0)>0,TRUE,FALSE)))) 

说明:

  1. ARRAYFORMULA(MATCH(col1,col2,0))在包含值匹配条件的数组第一行中找到,0/1确定匹配是从顶部还是从底部开始。对于独立使用,MATCH在产生第一个结果后停止。在ARRAYFORMULA上应用MATCH会让我们接近我们想要的结果 - 它会产生一系列结果。但是,如果项目不匹配,则返回错误,因此您可以在列中获得如下所示的内容:

    N/A 
    2
    3
    1
    3
    2
    N/A
    N/A
    N/A
    1
    3
    
  2. 这些N/A内容对我们没有好处,因为我们总是想要某种行号。这里有IFERROR,用“ol”替换所有N\A“0”:IFERROR(MATCH(col1,col2,0),0) Google Spreadsheet永远不会计算“0”的行数(它从“1”开始,只有偏移量从零开始),所以除非您的数据包含“0”,否则这是非常安全的 - 而不是将其更改为其他任何安全的情况。< / p>

  3. 由于FILTER希望在filtering_criteria中使用布尔值的单列数组或计算为布尔数组(https://support.google.com/drive/table/25273?hl=en)的表达式,我们需要确保ARRAYFORMULA生成这样的布尔数组。 IF派上用场 - 总是生成TRUE或FALSE:IF(IFERROR(MATCH(col1,col2,0)>0,TRUE,FALSE)

  4. 现在重新对这些东西应用ARRAYFORMULA,以便在阵列上工作渲染数组结果而不是单个结果:ARRAYFORMULA(IF(IFERROR(MATCH(col1,col2,0)>0,TRUE,FALSE))并将其放在FILTER内...瞧,它有效。

  5. 参考:http://productforums.google.com/forum/#!topic/docs/PpnZinkLzQs