我正在进行数据迁移练习,并且有超过 100K 行的 as/sheet,因此我需要一个超出手动更新的解决方案。
为了便于本文,我将简化问题:我有一个包含三列(A、B 和 C)的 as/sheet,标题 [数据类型] 如下:名称 [文本]、ID [数字]、创建日期 [日期]。数据已按 A 列排序,以刻意突出该列中的重复值。ID 是唯一的;日期是不是独特的。
在该示例中,有 9 行可以根据 A 列中的重复值“分组”为三组。因此,第 2 行和第 3 行的 A 列中的值为abc
,第 4、5 和 6 行的 A 列中的值为def
,第 7-10 行的 A 列中的值为ghi
。
第一个任务是确定每个“行组”中最新的 CreateDate。因此,在此示例中,第 2 行和第 3 行的 CreateDate 为 5/11/1999,第 4 行至第 6 行的 CreateDate 为 3/12/2001,第 7 行至第 10 行的 CreateDate 为 5/11/1999。我使用{=MAX(IF(A2=$A:$A,$C:$C))}
D 列中的数组公式来执行此操作。
下一个任务很困难。现在我已经确定了每个行组的最新日期,我想将与该 LatestDate 相对应的 ID 放在 E 列(在行组的每一行上),以便结果看起来像下面示例中的 E 列。但我需要使用公式/函数来执行此操作,而不是手动执行。这是针对迁移项目的,因此不必很漂亮。
将匹配的 ID 放在同一行的 E 列中很容易(IF 语句)——参见第 3、6 和 9 行——但我并不假装这就是解决方案。但我不知道如何用相同的 ID 填充每个组中的其他行——在我附加的示例中,应该是第 2、4 和 5 行、第 7 和 8 行以及第 10 行。我不能只在 C 列中进行查找,因为这些值不是唯一的。在尝试了各种公式但徒劳无功后,我不知所措。我猜它需要依赖于 C 列(匹配的值)和诸如INDEX
和之 类的函数MATCH
……或者可能是 VBA。
+------+------+------------+------------+-----------------+
| A | B | C | D | E |
+----+------+------+------------+------------+-----------------+
| 1 | Name | ID | CreateDate | LatestDate | CorrespondingID |
| 2 | abc | 1 | 4/12/1998 | 5/11/1999 | 2 |
| 3 | abc | 2 | 5/11/1999 | 5/11/1999 | 2 |
| 4 | def | 3 | 1/12/1999 | 3/12/2001 | 5 |
| 5 | def | 4 | 5/11/1999 | 3/12/2001 | 5 |
| 6 | def | 5 | 3/12/2001 | 3/12/2001 | 5 |
| 7 | ghi | 17 | 1/17/1999 | 5/11/1999 | 55 |
| 8 | ghi | 42 | 2/4/1999 | 5/11/1999 | 55 |
| 9 | ghi | 55 | 5/11/1999 | 5/11/1999 | 55 |
| 10 | ghi | 83 | 3/28/1999 | 5/11/1999 | 55 |
+----+------+------+------------+------------+-----------------+
答案1
我的参考是这里. TLDR:使用非数组版本的索引匹配公式。
在 E2 中输入:
=INDEX(B:B,MATCH(1,INDEX((A2=A:A)*(D2=C:C),0,1),0))
想法:内部 index() 生成一个符合名称和日期条件的 0 和 1 列表。然后使用外部 index() 从 A:A 中“加载”名称。
答案2
此解决方案使用偏移匹配方法。使用匹配查找日期,然后根据日期偏移查找相应的 ID:
=OFFSET(C2,MATCH(D2,C2:C,0)-1,-1)
将其放入 E2 单元格,然后向下拖动到 E
答案3
B
对于给定的行(例如,第 2 行),您想要从行中 找到 ID(列 )n(即 Cell ),其中名称 ( ) 等于当前行中的名称 ( ),而 CreatedDate ( ) 等于当前行中的 LatestDate ( )。行 Bn
An
A2
Cn
D2
n是唯一的,因为 ID 是唯一的,所以“这”行是最大行。一个合乎逻辑的答案是对 Column 公式进行微小的扩展 D
:
=MAX(IF(AND(A2=$A:$A,D2=$C:$C), $B:$B))
不幸的是,AND
在数组公式中似乎不起作用。因此我们使用一个标准技巧:
TRUE
= 1(或除零以外的任何数字)和 FALSE
= 0,这样我们就可以AND
用乘法来模拟(AND(TRUE,TRUE)
= TRUE
就像 1 × 1 = 1, = 就像 0 × AND(FALSE,anything)
FALSE
任何事物 = 0)。因此我们将上式改为
=MAX(IF((A2=$A:$A)*(D2=$C:$C), $B:$B))
(当然,以数组公式形式输入,使用Ctrl++ ):ShiftEnter
请注意,这适用于非唯一 CreatedDates。即使 CreatedDates 的顺序与 ID 的顺序不同,它也能正常工作,如上例所示(其中数据按 Columns A
和 排序B
)。