筛选出每个人最高星级的记录(升级版)

今天就来一个升级版的问题,筛选出每个人最高星级的记录。如下图所示,左表是数据源,右表是我们想要得到的效果。姓名我就用ABCD代替了,以姓名A为例说明一下题意:A对应的星级有6颗星,3颗星,4颗星,2颗星,我们只取最大的6颗星,并且把姓名也提取出来。BCD也是一样的,最后的结果如DE列所示。星星的颗数不超过10颗,每个人最高星级的只有1个。这个题目用数据透视表应该也做不出来吧?(我的数据透视表水平是小白级别

)。

想要做出这个题,就不能像之前那样直接使用maxifs了,因为B列的星级是文本。所以,首先需要把B列的星级变为数字(星星的颗数),然后再用maxifs求出每个人的最高星级,最后用最高星级和当前的星级比较是否相等,相等的就是我们想要的。用一对多查询的方法返回对应的值就可以了。这样的话就要增加辅助列了,如下图所示。

如果不用辅助列能不能做到呢?其实用countifs就可以,它可以对文本进行大小的比较(我之前默认如果是文本的话countifs也不行,写着写着才发现它是可以的

)。如下图所示,countifs得到了组内的大小排名,等于1的就是每个人的最高星级,所以只要筛选出等于1的就得到了我们想要的结果。公式我就不写了,大家自己写一下,可以参考之前的文章。

还说是升级版题目,没想到被countifs就给破了,啪啪打脸。

不过countifs这种方法本来不是我今天想分享的,只是半路想出来的。主要想分享的是如何用一个内存数组得到每个人的最高星级数。下图C列就是每个人的最高星级数,比如A的最高星级是6,所以每个A都是6。D列是本来的星级数,用C列的最高星级数和D列的本来星级数比较,相等的就是我们想要的,如箭头所示。

所以,如何得到每个人的最高星级数就是当前的主要问题。不能用辅助列,并且结果是一个内存数组。这样的话,对我来说还是挺难实现的。下面来看看高手是怎么做到的?主要用到的方法是矩阵取最小值法。

=N(A2:A16=TRANSPOSE(A2:A16))这部分返回的结果如下图灰色区域所示,用A列的姓名和转置后的姓名进行相等的比较,形成一个二维数组,也可以说是一个矩阵。这个矩阵可以理解为用A列的姓名和每个姓名分别比较,比如G列是A列的姓名中等于A的,H列是A列的姓名中等于B的。。。以此类推。

=(A2:A16=TRANSPOSE(A2:A16))*LEN(B2:B16)这部分返回的结果如下图红色框所示,就是用上一步的结果乘以对应的星级数。这样的话,等于A的就返回A对应的星级数,比如G列等于A的分别是6,3,4,4,2。同样的,H列等于B的分别是3,4,5。得到这些数有什么用呢?其实我们想要从G列中取得A的最高星级6,从H列中取得B的最高星级5,从I列中取得C的最高星级8,。。。也就是我用红色标记的那几个数字。

如何从这个二维矩阵中取出每个人的最高星级数呢?=(A2:A16=TRANSPOSE(A2:A16))*LEN(B2:B16)+COLUMN(A:O)/1%这部分返回的结果如下图所示,其实就是给第1列加100,第2列加200,第3列加300。。。这样的话第1列的数据肯定比第2列的小,第2列的又比第3列的小。。。同时106是第1列的最大值,205是第2列的最大值,308是第3列的最大值。

每一列中有15个数字,所以106在这个二维数组中是第15个最小值,205是第30个最小值,308是第45个最小值。。。以此类推。=SMALL((TRANSPOSE(A2:A16)=A2:A16)*LEN(B2:B16)+COLUMN(A:O)/1%,ROW(1:15)*15)这部分返回的结果如下图C列所示,从这个二维数组中提取出第15个,30个,45个。。。最小值。因为一共有15列,所以是ROW(1:15)*15。

上图C列数字的个位数就是每个人的最高星级数。所以用mod除以100取余数就可以了,公式为=MOD(SMALL((TRANSPOSE(A2:A16)=A2:A16)*LEN(B2:B16)+COLUMN(A:O)/1%,ROW(1:15)*15),100)。至此,每个人的最高星级数就求出来了。然后用最高星级数和当前星级数比较,相等的就是我们要的。用一对多的套路查询出来就可以了。

最后完整的筛选公式为=INDEX(A:A,SMALL(IF(MOD(SMALL(($A$2:$A$16=TRANSPOSE($A$2:$A$16))*LEN($B$2:$B$16)+COLUMN($A:$O)/1%,ROW($1:$15)*15),100)=LEN($B$2:$B$16),ROW($2:$16),4^8),ROW(A1)))&"",按ctrl+shift+enter三键结束,向右向下填充。

由于二维矩阵占的位置比较大,截图可能显示不完整,强烈建议大家下载文件查看,而且文件中不只一种方法。

文件链接:

https://pan.baidu.com/s/1IO8VJWumn7W-Zn6rNBMSBQ

提取码:2sym

(0)

相关推荐

  • 掌握了MMULT函数,你就拿到了打开通往函数至高境界大门的钥匙

    送人玫瑰,手有余香,请将文章分享给更多朋友 动手操作是熟练掌握EXCEL的最快捷途径! MMULT函数对于初学者来讲是一个比较陌生的函数,但不代表它默默无闻.函数发烧友对它趋之若鹜.今天我就来带大家一 ...

  • 筛选出每个人最高分的记录(二)

    大家好,关于昨天的问题,今天来说另外一种方法,主要用的是frequency和match函数.最近我挺喜欢用frequency的,尽管我对它的掌握是有限的.一题多解可以拓展思维,如果你有心想学函数,不妨 ...

  • 筛选出每个人最高分的记录(一)

    大家好,好久没更新文章了.最近这段时间没有动力,感觉爱也爱不了,恨也恨不了,做题也做不出,一直处于挣扎的状态,但又挣扎不出来,深深地无力感,受挫感.算了,那就不挣扎了,接受有些事情和有些题目自己目前是 ...

  • excel如何快速筛选出销售业绩大于5000的记录

    在excel中如何快速筛选出销售业绩大于5000的员工记录呢? 打开一个"销售业绩统计表",如图所示. 单击选中表格中的第一行,如图所示. 按Ctrl+shift+L,为表格第一行 ...

  • excel如何快速筛选出成绩排名前5的记录

    在excel中如何快速筛选出成绩排名前5的记录呢? 打开一个"成绩统计表",如图所示. 单击选中表格第一行,如图所示. 按Ctrl+shift+L,为第一行添加筛选按钮,如图所示. ...

  • 倒序筛选出不重复的记录,结果以倒序排列

    同学们,大家好.昨天说了两种去重的套路,一个是查找第一次出现的,一个是查找最后一次出现的.但是它们返回的结果都是从上到下排列的.今天还是讲解倒序查找不重复的记录,并且返回的结果还是倒序排列,也就是从下 ...

  • 筛选出不重复的记录(正序和逆序)

    那么我们来看下数据源.如下图所示,A列是源数据,有北上广深4个城市,它们有重复的,现在要筛选出不重复的记录,结果如CD两列所示.这是筛选出第1次出现的城市,也是正向查询. 下图是筛选最后1次出现的记录 ...

  • 第642期 | Excel技巧:如何快速筛选出不完整的行记录?

    --正文开始-- 什么是不完整行记录?下图中箭头所指的每一行就是不完整的记录行. (不完整行记录) 那我们怎能快速的筛选出来呢?这也是一位小伙伴在微信中提问.但直接筛选似乎无法直接筛选出来. 要实现这 ...

  • 这一招轻松搞定“合并单元格筛选时只筛选出第一条记录”的难题

    最近推送的五篇文章: 如何批量向下填充空白单元格?表哥表妹必会技巧! 如何正确地提问才能得到群友的帮助? 这款免费对账软件十秒钟对完一万条,秒杀收费软件, Excel冷门但非常好用的功能②:用视图管理 ...

  • 练习题044:如何粘贴数据到筛选出的记录行

    在工作中我们经常会有这种需求:将已有表格已筛选的数据粘贴到某个已经筛选的表格的记录行.如下图 需要将上面图表的C3:C21已经筛选的行(不包含已隐藏行的数据),复制粘贴到下面表格相应的行(要粘贴的行与 ...