倒序筛选出不重复的记录,结果以倒序排列
同学们,大家好。昨天说了两种去重的套路,一个是查找第一次出现的,一个是查找最后一次出现的。但是它们返回的结果都是从上到下排列的。今天还是讲解倒序查找不重复的记录,并且返回的结果还是倒序排列,也就是从下往上的顺序。
还是看下数据源和最后的效果图吧。和昨天的数据源一样,还是北上广深4个城市,从下往上查找不重复的记录,并且输出的结果也是按从下往上的顺序,如CDEF列所示。
其实,和昨天的思路是差不多的,只不过返回的顺序不同。在C2单元格输入公式=IFERROR(INDEX(A:A,LARGE(IF(FREQUENCY(ROW(A:A),MATCH(A$2:A$15,A$2:A$15,)+1/ROW($2:$15)),ROW($2:$16)),ROW(A2))),""),按三键结束,向下填充。
这个公式和昨天的公式基本上是一样的,只不过将small改为large,然后从第2个最大值开始提取。
首先来看=FREQUENCY(ROW(A:A),MATCH(A$2:A$15,A$2:A$15,)+1/ROW($2:$15))这部分,它返回的结果如下图B列所示,可以看到非0值对应的就是最后1次出现的记录,而且它的结果元素会比第2参数多出1个元素,也就是最后的1048570。
对应的位置找到了,然后就用if返回对应的行号,结果如上图C列所示。也就是=IF(FREQUENCY(ROW(A:A),MATCH(A$2:A$15,A$2:A$15,)+1/ROW($2:$15)),ROW($2:$16))这个公式。
由于要倒序排列,所以提取行号要从大到小提取,但是第1个最大值16不是我们要的,所以从第2个最大值开始提取,然后第3个,第4个。。。,也就是15,14,13,6,公式就是这部分=LARGE(IF(FREQUENCY(ROW(A:A),MATCH(A$2:A$15,A$2:A$15,)+1/ROW($2:$15)),ROW($2:$16)),ROW(A2))。
然后就用index返回对应的内容,当提取到第5个最大值时,会出错,因为没有第5个数字了,所以最后用iferror处理下错误。
再来看下D列的公式,在D2单元格输入公式=IFNA(LOOKUP(1,0/(COUNTIF(D$1:D1,A$2:A$15)=0),A$2:A3),""),不用三键,向下填充。这个公式用的是动态区域。所以不同单元格的时候,区域是会变化的。
第1次是D2单元格,countif的区域是D1,条件是A$2:A$15。意思就是在D1单元格查找有没有A$2:A$15的内容。第1次肯定全部都没有,返回的结果都为0,如下图B列所示。此时我们要返回最后1个0对应的城市。所以要用countif返回的结果等于0,然后再用lookup返回对应的城市。此时D2的结果就是"上海"。
向下填充到D3单元格时,此时countif的区域变为D1:D2,条件还是A$2:A$15,意思就是在D1:D2中统计A$2:A$15的个数,结果如下图所示。由于D1:D2中包含"上海",所以上海的个数为1。但因为我们还是要找最后1个0对应的城市,所以就相当于把"上海"排除出去了,也就是去重了。此时D3返回的结果为"广州"。
剩下的单元格,大家自己按F9查看。当把所有的城市取出来后,再下拉就会出错,所以用ifna处理下错误。
E列的公式:在E2单元格输入公式=IFNA(LOOKUP(1,0/ISNA(MATCH(A$2:A$15,E$1:E1,)),A$2:A3),""),向下填充。
F列的公式:在F2单元格输入公式=LOOKUP(,0/FREQUENCY(1,ISNA(MATCH(A$2:A$15,F$1:F1,))+1/ROW($2:$15)),A$2:A3)&"",向下填充。
链接:
https://pan.baidu.com/s/1o61GkFWmcW6PVi9Vgqta9A
提取码:u3px