Vlookup并获取最小值(日期)

时间:2013-02-28 19:58:09

标签: excel excel-formula excel-2010

TOP表是输入,下表是所需输出的预览。

对于每个ID,我需要找到最早的日期时间。我还需要其他专栏的其他信息(请参见下图)。

我目前的解决方案是: 在单元格E2 =A2中    单元格E3向下拖动=IF(E2<>A3,IF(E1=A3,"",A3),"")

在单元格F2中,向下拖动=IF(E2<>"",MIN(IF($A$2:$A$14=E2,$C$2:$C$14)),"") Ctrl + Shift + Enter

enter image description here

6 个答案:

答案 0 :(得分:8)

没有任何中间计算的另一个选项:

  1. 选择开始的整个范围 E2以及ID所在的最后一行 - 对于给定第14行的示例,请选择范围E2:E14:{{1并按 CTRL + SHIFT + ENTER 而不是通常的 ENTER - 这将定义 Multicell ARRAY 公式并会在其周围生成卷曲的=IFERROR(INDEX($A$2:$A$14,SMALL(IF(MATCH($A$2:$A$14,$A$2:$A$14,0)=ROW(INDIRECT("1:"&ROWS($A$2:$A$14))),MATCH($A$2:$A$14,$A$2:$A$14,0),""),ROW(INDIRECT("1:"&ROWS($A$2:$A$14))))),"")括号(但 NOT 会手动输入它们!)。
  2. {}(ID2):F2 - 正常公式。
  3. =IF(E2="","",SUMPRODUCT(--(E2=$A$2:$A$14),--(G2=$C$2:$C$14),$B$2:$B$14))(最短日期):G2并按 CTRL + SHIFT + ENTER 而非常规< kbd> ENTER - 这将定义 ARRAY 公式,并在其周围生成大括号=IF(E2="","",MIN(IF(E2=$A$2:$A$14,$C$2:$C$14,2^100)))括号(但 NOT 手动输入它们!)
  4. {}(InCh):H2 - 正常公式。
  5. 说明:

    • 要使解决方案更紧凑且易于阅读,请为=IF(E2="","",INDEX($D$2:$D$14,SUMPRODUCT(--(E2=$A$2:$A$14),--(F2=$B$2:$B$14),--(G2=$C$2:$C$14),ROW(INDIRECT("1:"&ROWS($D$2:$D$14))))))列定义命名范围,然后使用ID引用其他数据列。
    • ID2值可能不唯一 - 因为它们位于ID OFFSET的样本上。
    • 1...3的结果集的格式应与源Min Date行的格式相同。
    • 解决方案的关键公式 - 是多单元怪物,它返回没有空行的唯一ID - 如OP请求的那样)

    示例文件:https://www.dropbox.com/s/d2098updfh8djnf/MinDateIDs.xlsx

答案 1 :(得分:2)

这是一个相当大的挑战......我想我找到了一种有效的方法。为了清楚起见,我使用了一些辅助列。此外,我没有使用任何命名范围,但坚持列行指示。你可能想改变它。

看起来像这样:

Screenshot of XLS with helper columns

并放大相关列:

Screenshot of the newly inserted columns

F包含用于过滤掉重复项的数组公式。解释了一种方法here。我在F2中使用的公式是

=INDEX($A$2:$A$14, MATCH(MIN(IF(COUNTIF($F$1:F1,$A$2:$A$14)=0, 1, MAX((COUNTIF($A$2:$A$14, "<"&$A$2:$A$14)+1)*2))*(COUNTIF($A$2:$A$14, "<"&$A$2:$A$14)+1)), COUNTIF($A$2:$A$14, "<"&$A$2:$A$14)+1, 0))

使用 Ctrl - Shift - 输入确认为数组公式。将其向下拖动或复制到列F中。然后,列GH包含重复ID值的起始和结束索引。 This answer有帮助,请提升它:-)。使用的两个公式是:

=MATCH(2,1/FREQUENCY($F2,$A$2:$A$14))
<{1>}中的

G2
=FREQUENCY($A$2:$A$14,$F2) 中的

。再次,将它们向下拖动以填充完整的列。接下来,列H2仅用于说明 - 并用于完整性检查。它包含每个子阵列所需的最小日期。列I将该公式替换为J以查找所需日期的实际索引。

MATCH
<{1>}和

中的

=MIN(OFFSET($C$2:$C$14,$G2-1,0,1+$H2-$G2,1))
I2中的

。最后,=$G2-1+MATCH(2,1/FREQUENCY(MIN(OFFSET($C$2:$C$14,$G2-1,0,1+$H2-$G2,1)), OFFSET($C$2:$C$14,$G2-1,0,1+$H2-$G2,1)) J2L列通过

索引到原始数据集
M
N中的

,您可以水平拖动然后垂直拖动。

完成后,您可以隐藏辅助列,或将所有内容折叠成大型公式。祝你好运......可能有一种更简单的方法来实现这一目标,但我没有找到它。

答案 2 :(得分:1)

如果您想要G中D列的值,那么假设C列值是唯一的,您可以使用VLOOKUP,即在G2中复制

=VLOOKUP(F2,C$2:D$14,2,0)

答案 3 :(得分:0)

根据你的照片,它们都在同一张纸上。只需按ID排序,然后排序Date(升序)。当您沿着ID列向下移动时,每次ID更改时,您都知道您找到了该特定Date的最小ID行。创建一个额外的列以表示发生ID更改的位置,并过滤这些行(如果您愿意,请隐藏该列)。

而且......瞧。

答案 4 :(得分:0)

知道这个链接是旧的,但有一个更短更简单的方法! 如何使用最小为字段设置使用数据透视表,然后执行=GETPIVOTDATA()以获取信息! 看起来像这些公式简单得多!

答案 5 :(得分:0)

实际上,我只是意识到我一直在考虑这个问题……Excel保留了最重要的内容,并在删除重复项时删除了所有后续内容。 因此,如果仍然要创建一个额外的工作表,为什么不只复制要保留的范围/列,然后使用基本排序。 首先按ID排序,然后按要作为第二个过滤器的列排序。确保排序按照您想要的顺序进行(例如,从最新到最旧,从最旧到最新,从A到Z,从最大到最小等)。 数据排序后,根据ID删除重复项。您将剩下所有数据列,并按每个人的最新/最旧/最大/最小过滤。 这适用于我的表格,具有30,000多个记录,可以过滤掉1500个唯一的具有最新(加上相关数量)的个人,并具有第二个过滤器,每个人最大(加上相关的日期)。