用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(即最低的会话编号)。
你的本能使用INDEX
和MATCH
是正确的。 如果他们按照时间顺序,没有必要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数据的顺序如何:
- 插入数据透视表
- 将用户,date和会话添加到行标签(您可以交换用户和date,但会话必须是最后一个)
- 添加时间到值
- 总结时间(分钟)(如果会话是唯一的,则和/ Max实际上具有相同的结果,因为每个会话只有一个值,Min在这里听起来更好。
- 将最小时间字段的数字格式更改为时间(右键单击字段,值字段设置,数字格式,时间)
- 将报表布局更改为表格(在数据透视表工具>devise选项卡上)
- 更改报告布局以重复所有项目标签
- 删除小计
- 删除大总计
- 右键点击Session字段,然后selectFilter> Top 10 …
- 设置为:显示底部1个项目按时间的最小值(这将导致只有第一个会话显示为每个用户/date组合基于最早的时间)