25

I have a Google Spreadsheet containing the teams of the UEFA EURO 2012, and their scores:

Team     Points  Goals scored
------   ------  ------------
Germany    6          3
Croatia    3          3
Ireland    0          1
...       ...        ...

Now I want to filter that list, so that the result contains only a subset of the teams involved. Specifically, I want the resulting list to contain only the teams Germany, Netherlands, Portugal, Italy, England, France, Spain and Croatia.

I know I can use the FILTER function to extract a single value from the table. Thus, I could probably write a FILTER expression like =FILTER(A2:C; A2:A = 'Germany' OR A2:A = 'Netherlands' OR A2:A = 'Portugal' OR ...) but I would like to avoid this, as the list of teams is sort of dynamic.

So the question is: How can I filter the table by a range of values - not just a single value?

4

3 回答 3

64

对于像我一样偶然发现此线程的寻求答案的人,请参阅此Google 产品论坛页面,其中 Yogi 和 ahab 都针对如何通过另一范围数据过滤一系列数据的问题提出了解决方案。

如果A3:C包含要过滤的 UEFA EURO 2012 数据范围,并且D3:D包含要过滤的球队列表,则E3...

=FILTER(A3:C, MATCH(A3:A, D3:D,0))

或者

=FILTER(A3:C, COUNTIF(D3:D, A3:A))

阳性过滤结果

相反,如果您想按列出的团队进行过滤D3:D,那么E3...

=FILTER(A3:C, ISNA(MATCH(A3:A, D3:D,0)))

或者

=FILTER(A3:C, NOT(COUNTIF(D3:D, A3:A)))

负过滤结果

这是我为演示这些功能的有效性而制作的示例电子表格。

于 2014-10-30T00:11:40.990 回答
5

对于那些需要使用greg公式并与范围不匹配作斗争的人FILTER

=FILTER(A1:A, MATCH(A1:A, B1:B, 0))

=FILTER(A1:A, COUNTIF(B1:B, A1:A))

=FILTER(A1:A, ISNA(MATCH(A1:A, B1:B, 0)))

=FILTER(A1:A, NOT(COUNTIF(B1:B, A1:A)))

如果您需要使用FILTER公式来返回两个范围之间的评估,并且这两个范围的大小不同(例如从查询返回时)并且无法更改以匹配相同的大小并且您刚刚遇到FILTER has mismatched range sizes. Expected row count: etc.错误,那么这是一种解决方法:

为简单起见,假设您的过滤器范围是A1:A10B1:B8,您可以使用数组括号{}在范围上附加两个虚拟行B1:B8以匹配大小A1:A10,方法是使用REPTwhere 需要的重复次数通过简单的计算来计算初始范围。

然后在这个REPT公式中,我们需要添加 +1 作为更正/故障保护(在两个初始范围之间的差异为 1 的情况下),因为REPT最少重复 2 次。所以从某种意义上说,我们需要创建一个B1:B11(from B1:B8) 的范围,然后我们将只从一个范围中修剪最后一行,这样它就可以B1:B10反对A1:A10. 我们将使用 2 个独特的符号REPT

下一步是换行REPTSPLIT除以第二个唯一符号。然后,(基于进一步的需要)这SPLIT需要被包装到TRANSPOSE(因为我们想要将列大小与列大小相匹配),最后一步是通过简单的数学将它再次包装进QUERYlimit输出输出COUNTA(A1:A10)以修剪掉最后报告。放在一起看起来像这样:

=FILTER(A1:A10, NOT(COUNTIF(QUERY({B1:B8; 
 TRANSPOSE(SPLIT(REPT("♂♀", COUNTA(A1:A10)-COUNTA(B1:B8)+1), "♀"))}, 
 "limit "&COUNTA(A1:A10), 0), A1:A10)))

于 2019-02-20T21:37:46.440 回答
0

一些可能的和不同的方法:

=FILTER(C5:C;REGEXMATCH(C5:C;"one|two|five"))

结果:任何包含一、二、五的文本。区分大小写。

=FILTER(C5:C;REGEXMATCH(C5:C;JOIN("|";DC5:DC7)))

与之前相同,但值在列表中:DC5:DC7

=FILTER(C5:C;REGEXMATCH(C5:C;"^("&JOIN("|";EE5:EE7)&")$"))

与上一个相同 + 匹配整个文本


建议的较早选项:

=FILTER(C5:C;MATCH(C5:C;EG5:EG7;))

=FILTER(C5:C;countif(EK5:EK7;C5:C))

不区分大小写的结果。

相同,不在列表中

=FILTER(C5:C;ISNA(MATCH(C5:C;EF5:EF7;)))

有趣:给出列表之间的区别。

于 2021-05-28T14:25:17.990 回答