【问题标题】:Return value with INDEX/MATCH and a logical test使用 INDEX/MATCH 和逻辑测试返回值
【发布时间】:2017-07-27 20:53:53
【问题描述】:

我有一个表格,其中的唯一值按行显示。我需要将值返回当天正确的首次登录时间

     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 中的日期,但只返回 D;D 用于 A:A 中的最低会话

【问题讨论】:

  • 请包括您的公式。您可以使用MIN() 找到最小值,即最早的时间! ;)
  • 您好。到目前为止,我的公式看起来像这样:=INDEX(A:D,MATCH("U1"&"3/6/2017",B:B&C:C,0),D:D)。我实际上并没有直接使用 U1 和日期,而是使用单元格引用,所以语法错误不是问题。另外,我知道这是一个数组公式,所以用 Ctrl+Shift+Enter 确认。但是,我不知道如何从这里继续说check U1 in B:B and Date in C:C, but return only D;D for the lowest Session in A:A

标签: excel excel-formula


【解决方案1】:

您可以包含一个额外的帮助列IsFisrtLogin,公式如下:

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

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

【讨论】:

  • 这是完美的——我喜欢简单的解决方案。谢谢你,陶思克!
【解决方案2】:

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

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

作为 数组 公式输入(Ctrl+Shift+Enter 而不仅仅是 Enter)

结果如下所示(参见列I

【讨论】:

  • 在所有 OP 的编辑之后,我相信他/她实际上想要与用户关联的时间、日期和最低会话数,因此可能需要再进行一级查找。
  • 如果是这种情况,OP 是否可以将 INDEX($B$2:$B$3, 更改为 INDEX($E$2:$E$3,?这一切都假设结果是按时间顺序出来的。
【解决方案3】:

将此作为数组公式输入(使用 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)

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

【讨论】:

    【解决方案4】:

    作为公式的替代方案,您可以创建一个数据透视表,它会自动向您显示每个用户每天的第一次登录的会话数和时间,而不管数据的顺序如何:

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

    【讨论】:

    • 非常感谢,迈克尔。不幸的是,枢轴对我不起作用,因为我需要在另一个表中使用提取的值来匹配它与预定时间。
    【解决方案5】:

    试试,

    =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 的 SMALL 子函数的 k)替换为适当的序数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多