excel如何从列表中返回满足多个条件的数据
发布时间:2023-04-12 04:41:52
在实际工作中,我们经常需要从某列返回数据,该数据对应于另一列满足一个或多个条件的数据中的最大值。
如下图1所示,需要返回指定序号(列A)的最新版本(列B)对应的日期(列C)。

图1
解决方案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


猜你喜欢
- 本文介绍Microsoft Excel中MAX函数的语法和用法。函数说明MAX函数的主要作用是返回一组值中的最大值。函数语法MAX(numb
- 唐诗三百首,集结了唐朝诗人的优秀作品,是古代文化的结晶。大家可别小看了这本唐诗三百首,它的作用可大着呢!这不,星爷的新电影–西游降魔录里面,
- 在平常的学习和生活中,我们可能会遇到一些表格数据的整理及计算工作,大量数据,各种信息,繁琐又伤脑筋。我们可以利用Office进行办公和学习,
- Win11正式版已经开始推送了,目前还在使用Beta渠道的Win11预览版用户该如何升级到Win11正式版或者以上的预览版本呢?下面为大家带
- pdfshrink怎么压缩图片?pdfshrink可以极大程度的压缩文件,压缩文件大小,以便于满足email发送、打印、移动设备浏览、上传文
- 我们知道U盘,便于携带,随时随地来拷贝数据文件,也就是这样,极易感染到病毒,所以对U盘病毒来说,我们要必备一个U盘杀毒软件,那么U盘杀毒软件
- PS处理图片后该如何恢复原样?有些图片自己ps完后又不喜欢,该怎么还原呢?下面,小编就为大家介绍下PS处理图片后该恢复原样方法。打开Phot
- 一般我们电脑出现了黑屏,大致可以分为硬件和软件二大类的问题。正在使用某个软件的时候电脑黑屏了;或者是某个硬件用久了,也是会导致电脑黑屏的情况
- 我们的电脑在安装升级了win10操作系统之后,有的小伙伴在玩古墓丽影的时候就出现了游戏卡顿,突然卡住的情况。对于这种问题小编觉得可能是因为我
- 怎么隐藏qq等级图标? 攀比心理很多人都有,一些伙伴认为自己的qq等级太低了,而好友的等级很高,越看越烦,因此想隐藏qq等级图标,那么要如何
- 在Excel表格中插入图表后我们根据自己的实际需要设置想要的图表效果,比如我们可以在图表中添加各种图表元素,如坐标轴,网格线,误差线,趋势线
- 在WPS2009中,合理使用鼠标双击操作,可以有许多意想不到的效果,下面列举部分WPS2009中的标双击操作及对应功能。当用户区里没有文档被
- win8系统如何关机呢?win8系统和之前的系统关机方式有所区别,很多朋友使用win8系统都不知道如何关机。小编教你几种win8系统关机的方
- knbcenter.exe是什么,有什么作用 knbcenter.exe是猎豹浏览器安全以及升级功能的核心服务进程,会自动进行检测更新,自动
- Word上标输入小技巧:首先,你知道word上标怎么打吗?告诉你最快捷的方法,利用“上标”快捷键输入。我们用平方米2上标来举例:输入m2,选
- 本系列将介绍在windows server 2012 下 AD的详细部署文档,首先我们需要做以下准备工作:1、导入五台备用的虚拟机 
- Win10打印机怎么共享给Win7系统?最近有的用户想共享打印机,但是两台电脑的操作系统又不一样,一个是win10,一个是win7该怎么办呢
- Excel已经是很常用的办公软件了,但仍有人不知道如何实现自动累加,不过在这里没有关系了,小编把你教会,接下来不多说了,请大家跟小编学习Ex
- 最近有用户跟小编反映,电脑用着用着就弹出传奇游戏广告,非常影响用户的游戏体验,有什么办法可以彻底关闭传奇游戏广告呢?有同样问题的用户可以尝试
- 埋堆堆APP怎么投屏?埋堆堆APP是款热门的影视娱乐软件,在埋堆堆APP中用户们可在线观看到各种热门港剧,那么在使用的过程中我们该如何将港剧