用INDEX / MATCH和逻辑testing返回值

我有一个独特的值显示在表中的表。 我需要返回一天中正确的首次login时间的值

ABCD 1 Session User Date Time 2 1000 U1 3/6/2017 10:01 3 1234 U1 3/6/2017 12:00 

正如你所看到的,一个代理人有可能一天login两次,而且我只需要第一次

我想我可以使用INDEX和MATCH用户和date的多个标准,但是如何包括一个逻辑testing来检查较低号码的会话(以后的会话总是使用更高的会话ID号码)?

我的公式到目前为止是这样的:

 =INDEX(A:D,MATCH("U1"&"3/6/2017",B:B&C:C,0),D:D) 

我实际上并不直接使用U1和date,而是使用单元格引用,所以语法错误不是问题。

另外,我知道这是一个数组公式,所以用Ctrl + Shift + Enter确认。

但是,我不知道如何继续从这里开始,在C:C中检查U1中的B:B和Date,但是只返回D; D中的A中的最低的Session:A

你可以像这样包含一个额外的帮助栏IsFisrtLogin

 =COUNTIFS($B:$B,$B2,$C:$C,$C2,$A:$A,"<"&$A2)=0 

然后只筛选此公式计算结果为TRUE的行,您将只获得每个相应用户和date的第一次login(即最低的会话编号)。

你的本能使用INDEXMATCH是正确的。 如果他们按照时间顺序,没有必要find最小的东西,只要find第一个出现 – 这正是MATCH所做的。

 =INDEX($B$2:$B$3,MATCH(G2&H2,$C$2:$C$3&$D$2:$D$3,0)) 

作为数组公式input( Ctrl + Shift + Enter而不是Enter

结果看起来像这样(见第一栏)

在这里输入图像说明

input这个数组公式( 按Ctrl + Shift + Enter确认 ):

 =INDEX(A:D, MATCH( MIN(INDEX(A:D,MATCH("U1"&"3/6/2017",B:B&C:C,0))&"U1"&"3/6/2017" ,D:D&B:B&C:C,0) ,D:D) 

事实上,它只是获得最初的function,并与用户和当天匹配,以得到您想要的结果! ;)

尝试,

 =INDEX(D:D, AGGREGATE(15, 6, ROW($1:$99)/((B$1:B$99="U1")*(C$1:C$99=DATE(2017, 3, 6))*(A$1:A$99=AGGREGATE(15, 6, (A$1:A$99)/((B$1:B$99="U1")*(C$1:C$99=DATE(2017, 3, 6))), 1))), 1)) 

这将检索所提供date的最小数字会话编号,然后使用类似的包装公式中的编号来检索与会话,用户和date相关的时间。 请记住按时间格式化结果; 它将最初作为一个原始数字被检索。

"U1"DATE(2017, 3, 6)可以指包含该值的单元格。 对于第二,第三等匹配,用适当的序号replace, 1) (AGGREGATE的SMALL子函数的k )。

作为公式的替代scheme,您可以创build一个数据透视表,该数据透视表将自动向您显示每个用户每天首次login的会话号和时间,而不pipe数据的顺序如何:

数据透视表

  1. 插入数据透视表
  2. 将用户,date和会话添加到行标签(您可以交换用户和date,但会话必须是最后一个)
  3. 添加时间到值
  4. 总结时间(分钟)(如果会话是唯一的,则和/ Max实际上具有相同的结果,因为每个会话只有一个值,Min在这里听起来更好。
  5. 将最小时间字段的数字格式更改为时间(右键单击字段,值字段设置,数字格式,时间)
  6. 将报表布局更改为表格(在数据透视表工具>devise选项卡上)
  7. 更改报告布局以重复所有项目标签
  8. 删除小计
  9. 删除大总计
  10. 右键点击Session字段,然后selectFilter> Top 10 …
  11. 设置为:显示底部1个项目按时间的最小值(这将导致只有第一个会话显示为每个用户/date组合基于最早的时间)