提问人:Wisp 提问时间:10/13/2022 更新时间:10/17/2022 访问量:86
在 Excel 中交叉比较两个不同的数据对以发现差异的有效方法是什么?
What is an efficient way to cross-compare two different data pairs in Excel to spot differences?
问:
总结
我希望在 Excel 中比较两个数据集,并根据哪个已更改以及要更改的内容生成输出。
更多信息
我有两个数据库,它们都是独立更新的。我每个月都会对这些数据库进行交叉比较,看看哪些数据库发生了变化,以及谁拥有最准确的数据。然后修改另一个数据库以反映正确的值。我正在尝试自动决定需要更新哪个数据库的过程。我不仅比较数据变化,还比较数据随时间的变化。
例
在第 1 个月,数据库 1 包含值“Foo”。数据库 2 还包含值“Foo”。在第 2 个月,数据库 1 现在包含值“Bar”,但数据库 2 仍包含值“Foo”。我可以确定,由于数据库 1 具有不同的值,但上个月它们具有相同的值,因此数据库 1 已更新,数据库 2 应更新以反映这一点。
表示例
数据1 月1 | 数据2 Month1 | 数据1 个月2 | 数据2 Month2 | 要更新的数据库 | 原因 |
---|---|---|---|---|---|
傅 | 傅 | 傅 | 傅 | 没有 | 所有比赛 |
苹果 | 苹果 | 橙 | 苹果 | 数据2 | Data1 在之前匹配时具有新数据。Data2 需要使用新信息进行更新。 |
猫 | 狗 | 狗 | 狗 | 没有 | 它们以前不匹配,但现在两个数据库都匹配。 |
1 | 1 | 1 | 2 | 数据1 | Data2 在之前匹配时具有新数据。Data1 需要使用新信息进行更新。 |
AAA级 | 血脑屏障 | AAA级 | 血脑屏障 | 检查 | 两个数据库应该匹配,但无法确定应该更新哪个数据库。 |
美国广播公司 | 美国广播公司 | DEF的 | GHI指数 | 检查 | 两个数据库都已更改,但您无法判断 Data1 或 Data2 是否正确,因为它们是同时更新的。 |
电流逻辑
目前,我正在尝试使用多个嵌套语句以及一些 and 语句来使其工作。从本质上讲,该语句的示例部分是 (database 1, month 1 = DB1M1, etc.): 。=IF
=AND
=NOT
=IF(AND(DB1M1=DB2M1,DB2M1=DB2M2),"None",IF(AND(DB1M1=DB2M1,DB1M1=DB2M2,NOT(DB2M1=DB1M2)),"Data2",IF(ETC,ETC,ETC)
我在这方面取得了一些成功,但由于语句的长度,它非常混乱,我正在努力让它工作,因为对我来说,试图计算 just 子句中的可能结果变得不可读。我也毫不怀疑它的效率非常低,我想让它更有效率,特别是考虑到数据库的大小约为 10,000 行。=IF
最后的笔记/信息
我将不胜感激任何帮助。我热衷于学习,所以随时欢迎任何提示和建议。
我正在使用 MSO 365 版本 2202(我无法更新此版本)。这将在 Excel 的桌面版本中运行。我宁愿只使用公式来完成这项工作,但如果这是不可能的或效率非常低下,我愿意使用 Visual Basic。谢谢!
答:
在以前的类似场景中,使用按位运算或二进制数听起来很熟悉。二进制数背后的主要思想是每个数字都可以充当指示某些属性是否存在的标志。
目标是根据两个周期 (, ) 内的给定值确定两个数据库 (, ) 是否处于同步状态。如果一个数据库不同步,我们想知道要执行哪个操作才能使其与另一个数据库同步。同样,我们想知道两个数据库在期限结束时何时不同步。DB1
DB2
M1
M2
这是单元格中的Excel解决方案,然后向下扩展公式:M2
=LET(dec,
BIN2DEC(IF(B2=C2,0,1)&IF(D2=E2,0,1)&IF(B2=D2,0,1)&IF(C2=E2,0,1)),
DBsOnSync, ISNUMBER(FIND(dec, "0;10;3;9;11")),
DBsOutOfSync, ISNUMBER(FIND(dec, "7;12;13;14;15")),
IFERROR(IFS(dec=5,"Update DB1", dec=6,"Update DB2", DBsOnSync=TRUE,
"DBs on Sync", DBsOutOfSync=TRUE, "DBs out of Sync"), "Case not defined")
)
输入表尝试考虑所有可能的组合,以便我们可以构建逻辑。突出显示的列并不是真正必要的,它只是为了说明或测试目的。在之前已经定义的红色组合中,因此没有必要考虑。
解释
我们根据以下条件为每个二进制数字构建一个二进制数。这只是一个中间结果,用于将其转换为十进制数,并确定每个可能值的大小写。BIN2DEC
BIN2DEC(IF(B2=C2,0,1)&IF(D2=E2,0,1)&IF(B2=D2,0,1)&IF(C2=E2,0,1))
我们有四个条件,所以我们构建一个长度为的二进制数,其中每个数字代表一个标志条件(-equal,-not equal)。4
0
1
我们构建二进制数,该二进制数将通过串联我们正在寻找的逻辑条件作为输入。每个条件从左到右表示一个二进制数字:BIN2DEC
IF
IF(B2=C2,0,1)
检查 ,在(中间计算如 M1 列所示)中一致。DB1
DB2
M1
IF(D2=E2,0,1)
检查 ,在(中间计算如M2列所示)中一致。DB1
DB2
M2
IF(B2=D2,0,1)
DB1
随时间推移保持一致性(中间计算如 DB1 列所示)。IF(C2=E2,0,1)
DB2
在一段时间内保持一致性(中间计算如 DB2 列所示)。
将二进制数转换为十进制,我们可以识别每种情况,分配一组十进制数。以下十进制数或一组十进制数表示每种情况:
12 月 | 场景 |
---|---|
0,10,3,9,11 |
DBs on Sync |
5 |
Update DB1 |
6 |
Update DB2 |
7,12,13,14,15 |
DBs out of sync |
我们根据价值使用和识别每个案例。我们用于在字符串中查找表示每种情况的可能数字集。我们用来检查是否找到了这个号码。出于测试目的,我们将其作为最后一个资源包含在内,如果尚未定义某些情况,它将返回 .IFS
FIND
dec
FIND
dec
ISNUMBER
Case not defined
笔记
列 F:I 给出了最大可能组合数的提示。我们有四列,只有两个可能的值:、 。它代表组合,它代表我们可以拥有的最大可能的二进制数(我们有四个条件)。Sync
NotSync
2*2*2*2=16
4
从屏幕截图中可以看出,我们的唯一组合数量较少()。原因是因为我们构建二进制数的方式具有依赖性,因此某些组合是不可能的。12
评论
IF-ELSE
评论