取唯一值有很多种方法,VLOOKUP,LOOKUP,INDEX,无论是单条件还是多条件查询数据我们都可以通过组合公式找到需要的那个唯一值,如果要获取的是个数值,还可以通过SUMIFS,SUM,SUMPRODUCT等函数来获取。
今天的问题是条件重复的数据,我们如何来取得想要的数值:
表中的数据有两个条件,同时满足条件1,条件2的数据也有多行,第二行和第五行,都是A,A1所对应的数值。
我们的问题是:
- 取出最早的数据(第二行)
- 取出最晚的数据(第五行)
再引申一点,从开始取指定位置的数据,或者从结尾获取指定位置的数据。
方法有很很多种,我们介绍其中一种,如果你理解了这种方法,那么你就可以举一反三,用 其他的函数组合来找到答案。
解决这个问题的关键,在于找出这个问题的第三个条件,前两个条件很明显,第三个条件是个隐藏条件,就是数据所在的行号。
通过前两个条件,可以确定满足条件的多个数据,只有加上第三个条件,才能找出满足条件的唯一值。
我们先来计算满足条件最晚出现的数据:
=SUM((MAX(($A$2:$A$11=E2)*($B$2:$B$11=F2)*ROW($1:$10))=ROW($1:$10))*$C$2:$C$11)
在Excel里做这种与行号相关的运算时,用MAX函数会比用MIN函数要简单些:
- MAX(0,值),更容易得到想要的结果
- MIN(0,值),就需要增加一个步骤,把0换成比值更大的数,才能得到正确结果。
所以我们从简单的开始做起,这个公式的关键部分,就是这第三条件的书写:
(MAX(($A$2:$A$11=E2)*($B$2:$B$11=F2)*ROW($1:$10))=ROW($1:$10))
- 第一个条件:($A$2:$A$11=E2)
- 第二个条件:($B$2:$B$11=F2)
- 第三个条件:MAX(($A$2:$A$11=E2)*($B$2:$B$11=F2)*ROW($1:$10))=ROW($1:$10)
通过查看函数运行过程,就会明白,先是得到两个行号的最大值,然后再与行号进行比较,找出对应的数值:
得到{1;0;0;4;0;0;0;0;0;0},最大值是4:
再得到行号4所对应位置所在的值。
最早出现的数值
=SUM((MIN(IF(($A$2:$A$11=E2)*($B$2:$B$11=F2),ROW($1:$10),9^9))=ROW($1:$10))*$C$2:$C$11)
要稍微复杂一点,就是行号0值的处理,基本的原理与MAX相同,就是多了一个IF判断,这个IF函数要这么来理解:如果同时满足两个条件,就给出对应的行号,否则就给个特别大的值(9^9)。
然后再这个行号组合种,找到最小值,与全部的行号做比对,找出对应的数据。
来做一个对比,就明白为啥要用9^9,上图中的387420489=9^9,只有在这么多的大的数值中才能找到真正想要的最小值。
如果没有IF函数,MIN函数对应就是这样的情况,那么得到的最小值就是0,为不是我们想要的1。
有了上面连个组合公式的介绍,我们再来引申一下,任意指定位置的值如何来查找:
从后向前来查找
=SUM((LARGE(($A$2:$A$11=E2)*($B$2:$B$11=F2)*ROW($1:$10),1)=ROW($1:$10))*$C$2:$C$11)
Excel中与MAX相近的从大到小取值的函数是LARGE函数,比MAX函数多了一个参数,第二参数就是指定位置的参数,公式里是1,就与MAX函数的含义相同,查找最后一个值,如果想查找倒数第二个,就把第二参数修改为2就可以了。
从前向后查找
Excel中与MIN函数相近的是SMALL函数,可以从小到大取值,同样的多一个参数,通过修改这个参数,就可以查找不同位置的值。
最后,因为是要查找的是数值,所以我用了SUM,当然也可以用SUMPRODUCT函数,INDEX函数,LOOKUP函数,VLOOKUP函数,大家可以根据这个条件的书写,理解后自己尝试一下,怎么才能用其他函数查找重复值。