在 Excel 中交叉比较两个不同的数据对以发现差异的有效方法是什么?

What is an efficient way to cross-compare two different data pairs in Excel to spot differences?

提问人:Wisp 提问时间:10/13/2022 更新时间:10/17/2022 访问量:86

问:

总结

我希望在 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。谢谢!

数组 Excel IF-语句 Office365 比较

评论

0赞 David Leal 10/13/2022
Excel版本有错别字吗?请说明是哪个版本。看起来你来自未来,:-)
0赞 Wisp 10/14/2022
@DavidLeal - 版本号正确,取自 Excel 本身。版本号应该是什么?i.imgur.com/9NqjuWF.png
0赞 David Leal 10/14/2022
我明白了,是的,它令人困惑的Microsoft版本,也许这是一些内部号码跟踪。在您的问题中,您使用了标签 office365,所以我们很好。我想知道根据您提供的版本号,我们可以使用哪些 excel 函数。这是按 Excel 版本组织的 excel 函数列表

答:

0赞 David Leal 10/15/2022 #1

在以前的类似场景中,使用按位运算二进制数听起来很熟悉。二进制数背后的主要思想是每个数字都可以充当指示某些属性是否存在的标志。

目标是根据两个周期 (, ) 内的给定值确定两个数据库 (, ) 是否处于同步状态。如果一个数据库不同步,我们想知道要执行哪个操作才能使其与另一个数据库同步。同样,我们想知道两个数据库在期限结束时何时不同步。DB1DB2M1M2

这是单元格中的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")
)

sample excel file

输入表尝试考虑所有可能的组合,以便我们可以构建逻辑。突出显示的列并不是真正必要的,它只是为了说明或测试目的。在之前已经定义的红色组合中,因此没有必要考虑。

解释

我们根据以下条件为每个二进制数字构建一个二进制数。这只是一个中间结果,用于将其转换为十进制数,并确定每个可能值的大小写。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)。401

我们构建二进制数,该二进制数将通过串联我们正在寻找的逻辑条件作为输入。每个条件从左到右表示一个二进制数字:BIN2DECIF

  • IF(B2=C2,0,1)检查 ,在(中间计算如 M1 列所示)中一致。DB1DB2M1
  • IF(D2=E2,0,1)检查 ,在(中间计算如M2列所示)中一致。DB1DB2M2
  • 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

我们根据价值使用和识别每个案例。我们用于在字符串中查找表示每种情况的可能数字集。我们用来检查是否找到了这个号码。出于测试目的,我们将其作为最后一个资源包含在内,如果尚未定义某些情况,它将返回 .IFSFINDdecFINDdecISNUMBERCase not defined

笔记

F:I 给出了最大可能组合数的提示。我们有四列,只有两个可能的值:、 。它代表组合,它代表我们可以拥有的最大可能的二进制数(我们有四个条件)。SyncNotSync2*2*2*2=164

从屏幕截图中可以看出,我们的唯一组合数量较少()。原因是因为我们构建二进制数的方式具有依赖性,因此某些组合是不可能的。12

评论

1赞 Wisp 10/16/2022
谢谢你的回答。我真的很欣赏你的洞察力。它确实有意义,并且确实可以按要求工作,但有一个轻微的例外。如果添加第三个值,则似乎会产生不正确的答案。例如:a,a,b,c 表示要更新 DB2,但正确的输出应该是说 DBs 不同步。我可以通过将公式包装在 =IF 语句中以检查唯一值的数量来解决这个问题,并在值计数高于 2 时将其更改为“DBs 不同步”,但我想知道是否可以使用按位运算将其应用到您的逻辑中。提前非常感谢!
0赞 David Leal 10/17/2022
@Wisp这是正确的,那么这个案子就没有被考虑在内。我更新了答案以考虑这种情况。我必须添加一个附加条件,因此使用四位数而不是三位数的二进制数。我希望它有助于使这个想法适应您的实际问题。我的回答假装可以作为如何处理这种情况的指南。在我看来,有很多可能组合的场景,而不是构建复杂的条件,最好通过表示为二进制数的二进制条件来接近它。IF-ELSE