excel图表怎么从列表中返回满足多个条件的数据
在实际工作中,我们经常需要从某列返回数据,该数据对应于另一列满足一个或多个条件的数据中的最大值。
如下所示,需要返回指定序号(列A)的最新版本(列B)对应的日期(列C)。
解决方案1:
在单元格F2中输入数组公式:
=INDEX(C2:C10,MATCH(MAX(IF(A2:A10=F1,B2:B10)),IF(A2:A10=F1,B2:B10),0))
注意这里有两个IF子句,不仅在生成参数lookup_value的值的构造中,也在生成参数lookup_array的值的构造中。千万不能忽略了这一要点,即如果采用以下简单方法:
=INDEX(C2:C10,MATCH(MAX(IF(A2:A10=F1,B2:B10)),B2:B10,0))
尽管此公式构造仍可以返回正确的值,但完全不能保证所有情况下都正确。原因是与条件对应的最大值不是在B2:B10中,而是针对不同的序号。而且,如果该情况发生在希望返回的值之前行中,则MATCH函数显然不会返回我们想要的值。
可以将上面的公式解析来验证:
=INDEX(C2:C10,MATCH(MAX(IF({FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;TRUE},{4;2;5;3;1;3;4;1;2})),B2:B10,0))
转换为:
=INDEX(C2:C10,MATCH(MAX({FALSE;FALSE;FALSE;FALSE;FALSE;3;4;1;2}),B2:B10,0))
转换为:
=INDEX(C2:C10,MATCH(4,B2:B10,0))
转换为:
=INDEX(C2:C10,MATCH(4,{4;2;5;3;1;3;4;1;2},0))
很显示,数组中的第一个满足条件的值并不是我们想要查找的值所在的位置:
=INDEX(C2:C10,1)
得到:
2013-2-21
这并不是满足我们的条件对应的值。
回到正确的公式:
=INDEX(C2:C10,MATCH(MAX(IF(A2:A10=F1,B2:B10)),IF(A2:A10=F1,B2:B10),0))
转换为:
=INDEX(C2:C10,MATCH(4,IF(A2:A10=F1,B2:B10),0))
转换为:
=INDEX(C2:C10,MATCH(4,IF({FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;TRUE},{4;2;5;3;1;3;4;1;2}),0))
转换为:
=INDEX(C2:C10,MATCH(4,{FALSE;FALSE;FALSE;FALSE;FALSE;3;4;1;2},0))
这次,参数lookup_array的数组中出现的最大值4与条件指定的序号相关,公式转换为:
=INDEX(C2:C10,7)
结果为:
2014-10-7
解决方案2:
下面的公式更优雅:
=LOOKUP(1,0/FREQUENCY(0,1/(1+(A2:A10=F1)*B2:B10)),C2:C10)
先看看公式中的:
(A2:A10=F1)*B2:B10
转换为:
({12345;12345;12345;12345;12345;54321;54321;54321;54321}=54321)*B2:B10
转换为:
({FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;TRUE})*B2:B10
得到:
{0;0;0;0;0;3;4;1;2}
现在,来到公式中巧妙的部分。为了找到最大值在此数组中的位置(而不是像方案1一样使用MATCH(MAX,…等)组合,那需要重复生成上述数组的子句),进行如下操作:
我们首先给上面数组中的每个值添加一个小值。这是必需的,因为接下来将会对该数组中的值求倒数,如果不执行此操作,则数组中的零将导致#DIV / 0!错误,这会在将数组传递给FREQUENCY函数时使事情更复杂。
这样:
1/(1+(A2:A10=F1)*B2:B10)
转换为:
1/(1+{0;0;0;0;0;3;4;1;2})
得到:
{1;1;1;1;1;0.25;0.2;0.5;0.333333333333333}
这里的关键在于,将此数组作为bins_array参数的值传递给FREQUENCY函数,将零作为参数data_array的值。此时,公式构造:
FREQUENCY(0,1/(1+(A2:A10=F1)*B2:B10))
转换为:
FREQUENCY(0,{1;1;1;1;1;0.25;0.2;0.5;0.333333333333333})
求倒数之前数组中的最大值(即我们关注的值)为求倒数之后数组中的最小值。而且,如果我们传递一个所有值都在0到1之间的值数组作为FREQUENCY函数的参数bins_array的值,将0作为其参数data_array的值,那么零将被分配给参数bins_array中的最小值;其余的为空或为零。
由于数组中的最小值为0.2,在数组中的第7个位置,因此上述公式构造的结果为:
{0;0;0;0;0;0;1;0;0;0}
获得此数组后,我们只需要从列C中与该数组出现的非零条目(即1)相对应的位置返回数据即可。因此,公式:
=LOOKUP(1,0/FREQUENCY(0,1/(1+(A2:A10=F1)*B2:B10)),C2:C10)
转换为:
=LOOKUP(1,0/{0;0;0;0;0;0;1;0;0;0},C2:C10)
转换为:
=LOOKUP(1,{#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;0;#DIV/0!;#DIV/0!;#DIV/0!},C2:C10)
得到:
2014-10-7
最新推荐
-
怎样取消wps网盘在我的电脑中显示 关闭wps网盘显示
怎样取消wps网盘在我的电脑中显示?很多用户在下载安装wps办公软件后,发现我的电脑里多了一个wps网盘的 […]
-
手机剪映怎么添加第二个视频轨道 剪映增加视频轨道
手机剪映怎么添加第二个视频轨道?在手机剪映中,用户可以通过添加多条视频轨道来进行画中画效果,对要剪辑的视频 […]
-
华为手机纯净模式在哪里关闭 取消纯净模式华为
华为手机纯净模式在哪里关闭?华为手机默认的纯净模式是一种安全防护功能,可以保护用户的安全和数据隐私安全。在 […]
-
wps字的右上角的[1]怎么打 word文档右上角标注
本文主要介绍:很多小伙伴平时会通过WPS进行办公,比如对于一些相关的文档资料的整理的情况,那么就可以在WPS中的Word文字文档中进行操作,一些小伙伴想要知道怎么在文字旁边添加一个[1]的上标符号,想
-
win10怎么开启手写模式 win10怎么调出手写键盘功能
现在的win10系统是支持用户们连接手写板进行使用,在设备连接之后,还是需要将电脑中的功能启动才能够正常运行,很多小伙伴不知道应该如何设置开启手写面板的功能,针对这个问题,下面来为广大用户们进行解答,一起来看看详细的操作步骤吧。
-
手机剪映怎么删除多余视频片段 剪映怎么删掉部分视频
手机剪映怎么删除多余视频片段?手机剪映是一款强大的视频剪辑工具,它可以对用户们所拍摄的视频进行编辑,比如常 […]
热门文章
怎样取消wps网盘在我的电脑中显示 关闭wps网盘显示
2手机剪映怎么添加第二个视频轨道 剪映增加视频轨道
3华为手机纯净模式在哪里关闭 取消纯净模式华为
4wps字的右上角的[1]怎么打 word文档右上角标注
5win10怎么开启手写模式 win10怎么调出手写键盘功能
6手机剪映怎么删除多余视频片段 剪映怎么删掉部分视频
7win10如何把电脑改为无密码 win10取消开机账户登录的步骤
8win10访问共享文件要求输入网络凭据 访问共享电脑需要输入网络凭据怎么办
9手机剪映如何只导出音频mp3 剪映导出音频mp3
10edge怎么导入其他浏览器数据 edge浏览器导入chrome浏览器数据
随机推荐
专题工具排名 更多+