我们在处理数据时,重复数据常常会对分析造成很大麻烦,因此数据整理初期一个重要的工作是排重,excel2007以上版本中有一个删除重复项功常便捷,但是每次点来点去也很麻烦,下面我们用公式来对一些重复数据进行处理
一、【单列提取不重复值】
先将数据列定义名称
{=INDEX(名称,MATCH(,COUNTIF(E$1:E1,名称),))} 下拉
大致思路是:根据E$1:E1下拉形成一个动态区域,countif依次判断每个区域中相应数据的出现次数并形成一个内存数组,然后match判断0在数组中出现的位置,最后index来完成最后的引用。此公式不长也不难,有个值得注意的地方是match的使用,它的第一个参数被省略了,但是match的第一个参数又是“必需”的,这似乎违背规则,实际上并没有,因为excel对省略的参数默认为0,可以参与计算,它不等同于"",后者excel会认为其为文本值,无法参与计算,因此,MATCH(,COUNTIF(E$1:E1,名称),))等同于MATCH(0,COUNTIF(E$1:E1,名称),))
顺便说:我们经常使用countif来生成数组,从而将数据转化为1和0,例如,如果想计算单列重复数据个数,可以使用{=SUM(1/COUNTIF(名称,名称))}
二、【多列提取不重复值】
{=INDIRECT(TEXT(RIGHT(MIN(IF(COUNTIF($D$1:D1,$A$2:$B$8),4^8,ROW($2:$8)*100+COLUMN(A:B)*10001)),4),"r0c00"),)&""} 下拉
公式很长也比较复杂,数据列在A2:B8,提取列在D列,主要思路还是用countif生成内存数组,然后对这个数组进行处理最后达到目标,这里注意一个"r0c00",这个的意思是用text将处理后的数组变成单元格的RC引用形式,然后再用indirect进行引用
三、【查找重复值的对应信息】
如图,
想在产品列查询出某个产品对应的所有订单号,产品和订单号是一对多的关系,同一个产品有多个订单号,可用如下公式实现:
{=INDEX(B:B,SMALL(IF($A$2:$A$130=$C$1,ROW($A$2:$A$130),65536),ROW(1:1)))&""} 下拉
根据输入在C1的产品名,提取出其对应的所有订单号,大致思路是根据IF条件判断形成一个数组,此数组最大值是65536,其余是根据C1的条件形成的值,然后用small依次提取出第ROW()个最小值的位置并用index引用。