使用INDEX / MATCH返回值和逻辑测试

时间:2017-03-07 15:14:01

标签: excel excel-formula

我的表中有一行显示唯一值。我需要返回值为当天正确的首次登录时间

     A        B         C            D
1    Session  User      Date         Time
2    1000     U1        3/6/2017     10:01
3    1234     U1        3/6/2017     12:00

正如您所看到的,一个代理可以在当天登录两次,我只需第一次

我认为我可以将INDEX和MATCH用于用户和日期的多个条件,但是如何包含逻辑测试以检查具有较低数字的会话(以后的会话始终与会话ID号越高)?

到目前为止,我的公式看起来像这样:

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

我实际上并没有直接使用U1和日期,而是使用单元格引用,因此语法错误不是问题。

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

但是,我不知道如何从这里继续并说出检查B:B中的U1和C:C中的日期,但只返回A; A中最低会话的D; D

5 个答案:

答案 0 :(得分:2)

您可以添加一个额外的帮助列IsFisrtLogin,其公式如下:

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

然后只筛选出此公式计算结果为TRUE的行,并且您将只获得每个相应用户和日期的第一次登录(即最低会话数)。

答案 1 :(得分:2)

您使用INDEXMATCH的直觉是正确的。如果它们按时间顺序排列,则无需找到最小值,只需查找第一个出现位置 - 这正是MATCH所做的。

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

作为数组公式输入( Ctrl + Shift + 输入而非 Enter < / KBD>)

结果如下(参见专栏I

enter image description here

答案 2 :(得分:0)

尝试,

=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))

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

"U1"DATE(2017, 3, 6)可以引用包含该值的单元格。对于第二个,第三个等匹配,用适当的序数替换, 1)(AGGREGATE&#39的小部分函数的 k )。

答案 3 :(得分:0)

输入此数组公式(通过 Ctrl + Shift + 输入确认):

=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)

事实上,它只是获得初始功能的最小值,并将其与用户和当天相匹配,以获得您想要的结果! ;)

答案 4 :(得分:0)

作为公式的替代方法,您可以创建一个数据透视表,无论数据的顺序如何,它都会自动显示每天每个用户首​​次登录的会话编号和时间:

PivotTable

  1. 插入数据透视表
  2. 将用户,日期和会话添加到行标签(您可以交换用户和日期,但会话必须是最后的)
  3. 将时间添加到值
  4. 按Min分享时间(如果Sessions是唯一的,Sum / Max实际上会有相同的结果,因为每个Session只有1个值.Min只是听起来更好。)
  5. 将最短时间字段的数字格式更改为时间(右键单击字段,值字段设置,数字格式,时间)
  6. 将报表布局更改为表格(在数据透视表工具&gt;设计选项卡上)
  7. 更改报告布局以重复所有项目标签
  8. 删除小计
  9. 删除Grand Totals
  10. 右键点击会话字段,然后选择过滤器&gt;前10名......
  11. 设置为:按最短时间显示底部1项(这会导致仅根据最早时间显示每个用户/日期组合的第一个会话)