excel 需要一个公式来根据匹配条件查找最近的日期/时间

ldfqzlk8  于 2023-03-09  发布在  其他
关注(0)|答案(3)|浏览(1444)

1.您好,我是Excel新手,需要一些帮助。在“已送达”选项卡中,我需要根据“已送达”选项卡中的ID与“呼叫”选项卡中的ID的匹配情况,使用“呼叫”选项卡中的“已应答”和“日期/时间”列填充“已应答”和“已应答日期/时间”列。例如:对于第一行:ID:C763 G。我应该为Answered列获取M,为Date/Time Delivered列获取8/19/2021 11:29:00 PM。第1行的正确返回值以黄色突出显示。但我需要能够为其余行执行此操作。
交付选项卡

呼叫选项卡

我尝试过索引、匹配、min等的各种组合。

=INDEX(Calls!D2:D26,MATCH(MIN(ABS((Calls!B2:B26=B2)*(Calls!C2:C26-C2))),ABS((Calls!B2:B26=B2)*(Calls!C2:C26-C2)),0))

给出了错误的结果。Y而不是M。使用相同的公式,但将索引列更改为日期/时间列,它给我的是11/29/2019 12:39:36 AM,错误的日期和时间,而不是正确的8/19/2021 11:29:00 PM。
我也试过

=IFERROR(SMALL(IF((Calls!B2:B26=B2)*(Calls!C2:C26<=C2),Calls!C2:C26),1),"No Match")

以及

=MIN(IF((Calls!B2:B26=B2)*(Calls!C2:C26<=C2),Calls!C2:C26))

但这又给了我错误的结果。
感谢您提供的任何帮助。

xesrikrc

xesrikrc1#

=INDEX(Dates,MATCH(MIN(ABS(Criteria-DateTimes)),ABS(Criteria-DateTimes),0))
imzjd6km

imzjd6km2#

这里你不能使用近似搜索,例如通过XMATCH/MATCH,因为最近的可能在两个方向上,大于或小于,所以我们需要找到绝对差的最小值。它不能使用MAXIFS,因为它是一个RACON function,当我们调用一个范围内的操作时,例如ABS,它不再是一个范围。
这是一个数组版本(* 公式1*),它生成整个结果,* 假设对于任何查找ID您都可以找到数据 (如果此假设无效,请检查 * 下面的公式2)。

=LET(lk, A2:B4, in, A9:C13,lkA, INDEX(lk,,1), lkB,INDEX(lk,,2),inA,INDEX(in,,1), 
 inB, INDEX(in,,2), out, CHOOSECOLS(in,2,3), dates, MAP(lkA, lkB, LAMBDA(id,d, 
 LET(f, FILTER(inB, inA=id), XLOOKUP(MIN(ABS(d-f)), ABS(d-f), f)))), 
 CHOOSEROWS(out, XMATCH(dates, inB)))

由于要查找的日期可能是完全匹配的,因此我们不能使用以下内容:

FILTER(out, (inA=id) * (ABS(d-inB) = MIN((inA=id) * ABS(d-inB)))

因为没有办法区分最小差值何时为零,因为它与为不等于id的子集找到最小值的情况完全匹配。这就是我们使用XLOOKUP的原因。

基本上它是在每次MAP迭代时,它首先过滤以查找给定id的日期子集(并将其命名为f)。现在,我们为该特定子集找到与d相差最小的日期。MAP的结果命名为dates。最后,我们只需要确定与找到的日期匹配的行,我们使用CHOOSEROWS来完成这个任务,但是您也可以使用INDEX,如下所示:这是个人喜好的问题。
对于给定查找ID没有数据的情况。例如,行5IDD)来自上一屏幕截图中的查找数据(注意在 * 公式1* 中范围结束于行4),formula 1产生错误。为了防止它,对于更一般的情况,可以使用以下公式(* 公式2*):

=LET(lk,A2:B5,in,A9:C13,lkA,INDEX(lk,,1),lkB, INDEX(lk,,2),inA,INDEX(in,,1), 
 inB, INDEX(in,,2), out, CHOOSECOLS(in,2,3), dates, MAP(lkA, lkB, LAMBDA(id,d, 
 LET(f,FILTER(inB,inA=id,""),IF(@f="", "",XLOOKUP(MIN(ABS(d-f)),ABS(d-f),f))))),
 IF(dates="", {"ID not Found",""}, INDEX(out, XMATCH(dates, inB),{1,2})))

这里我们使用这个函数的第三个输入参数来检查FILTER是否为空集,因此如果出错,它将返回空字符串。IF(@f="", "",...)也特别处理这种情况返回一个空集。然后为了返回输出,我们使用一个IF条件将这种情况处理为"ID not found"。其余的都差不多。注意:这里我们需要使用INDEX,因为CHOOSEROWS会产生一个错误。
下面是输出:

68bkxrlz

68bkxrlz3#

我将假设要求是按ID和日期进行匹配,尽管交付可能是呼叫后的第二天(午夜)
并且给定的ID在一天内不被重用。
在Calls中,向左插入一个rowA(因为VLOOKUP只能查看右侧,而不能查看左侧)。
在A2中输入=C2&"_"&INT(D2)并向下拖动。
这就给了我们一把可以匹配的钥匙。
在“已交付”中,我们可以在右侧进行额外关闭。
在G2中输入=$B2&"_"&INT($C2),在H2中输入=$B2&"_"&INT($C2)-1并向下拖动。
我们从Delivered(注1)开始查找,因此Call可能是一天earlier
然后在E2 =IFERROR(VLOOKUP($G2,Calls!$A:$E,4,FALSE),VLOOKUP($H2,Calls!$A:$E,4,FALSE))中,即尝试匹配ID和日期;如果不匹配,则尝试ID和前一天。
将该公式复制到D2,并将4改为5。
往下拖。
注1:实际上,我建议您考虑一下这是否合适-您将错过任何呼叫没有交付,这是更有可能存在的比反过来。
注2:$不是绝对必要的,但是它们降低了出错的风险,特别是在进一步复制时。
注3:“_"&不是绝对必要的,但有助于可读性,从而减少错误的机会。

相关问题