在大型数据集中查找重复项 Excel
Find duplicates in large dataset Excel
我有这个任务似乎是重复出现的,我需要一个更好的解决方案。
我从两个不同系统的两个不同数据库中提取数据(不要问为什么,就是这样)。当我这样做时,最好我希望这两个数据集大小相同。我在两者上都有一个主键,我们称之为 "ID"。我想要做的是从 table1 和 table2 检查这个 ID 并获取唯一值(这样我就可以继续看看为什么我在一个 table 中有更多)。我的数据集变得非常大(大约超过 100 000 行),这使得我在 excel 中的 VLOOKUP 函数工作得非常慢。有什么方法可以在 excel 中用 speed 解决这个问题吗?使用 VBA 宏、枢轴 tables 或 excels 内置 SQL 的解决方案会很好。使用 excel 2016.
样本table:
ID_TableA ID_TableB
123456789208435989 123456789208435989
123456789239344137 123456789368934745
123456789368934745 123456789381895013
123456789381895013 123456789447760867
123456789447760867 123456789466692531
123456789466692531 123456789470807304
123456789470807304 123456789504343451
123456789504343451 123456789571573964
123456789563853210 123456789666106771
123456789571573964 123456789683792216
123456789666106771 123456789719645070
123456789683792216 123456789747751420
123456789719645070 123456789770236822
123456789747751420 123456789839975896
123456789770236822 123456789920037815
123456789825288494 123456789930612286
123456789839975896 123456789936072949
123456789920037815 123456789948401617
123456789930612286 123456789982601470
123456789936072949
123456789948401617
123456789982601470
解决方案的结果应输出:
123456789825288494
123456789563853210
123456789239344137
table中的数据是 18 个字符长的数字序列,其中前 9 个数字不变。
编辑: 两个 table 都可以包含唯一值。结果应该 return 两个 table 中唯一的值。
假设您在单个数据库的不同表中都有这些列,那么使用 SQL 很容易解决这个问题。这是一种方法:
SELECT a.ID_TableA
FROM TableA a
LEFT JOIN TableB b
ON a.ID_TableA = b.ID_TableB
WHERE b.ID_TableB IS NULL
UNION
SELECT b.ID_TableB
FROM TableA a
RIGHT JOIN TableB b
ON a.ID_TableA = b.ID_TableB
WHERE a.ID_TableB IS NULL;
另一种方式,使用EXISTS
:
SELECT ID_TableA
FROM TableA a
WHERE NOT EXISTS (SELECT 1 FROM TableB b WHERE a.ID_TableA = b.ID_TableB)
UNION
SELECT ID_TableB
FROM TableA b
WHERE NOT EXISTS (SELECT 1 FROM TableA a WHERE a.ID_TableA = b.ID_TableB);
您可以使用 powerquery (Get & Transform Data
):
let
SourceA = Excel.CurrentWorkbook(){[Name="tblA"]}[Content],
SourceB = Excel.CurrentWorkbook(){[Name="tblB"]}[Content],
UniqueA = Table.Join(SourceA,{"ID_TableA"},SourceB,{"ID_TableB"},JoinKind.LeftAnti),
UniqueB = Table.Join(SourceA,{"ID_TableA"},SourceB,{"ID_TableB"},JoinKind.RightAnti),
OutputList = List.Combine({UniqueA[ID_TableA], UniqueB[ID_TableB]})
in
OutputList
(编辑看到您对 return 来自 EITHER table 的唯一值的要求)
做一些测试,使用一些类似格式的模拟数据,这看起来相当快:
Input from tblA Rows: 250,000
Input from tblB Rows: 250,000
Start: 25/10/2018 14:17:13
End: 25/10/2018 14:17:15
Returned 41,042 unique values in about 2 seconds
虽然我会像其他人建议的那样使用 Access 查询来做到这一点,但这是我对你的问题的 2 美分。
VLOOKUP
速度很慢而且不是正确的函数。
Countif
好一点,但 ISNUMBER(MATCH())
似乎是迄今为止最快的组合。
看看
我有这个任务似乎是重复出现的,我需要一个更好的解决方案。
我从两个不同系统的两个不同数据库中提取数据(不要问为什么,就是这样)。当我这样做时,最好我希望这两个数据集大小相同。我在两者上都有一个主键,我们称之为 "ID"。我想要做的是从 table1 和 table2 检查这个 ID 并获取唯一值(这样我就可以继续看看为什么我在一个 table 中有更多)。我的数据集变得非常大(大约超过 100 000 行),这使得我在 excel 中的 VLOOKUP 函数工作得非常慢。有什么方法可以在 excel 中用 speed 解决这个问题吗?使用 VBA 宏、枢轴 tables 或 excels 内置 SQL 的解决方案会很好。使用 excel 2016.
样本table:
ID_TableA ID_TableB
123456789208435989 123456789208435989
123456789239344137 123456789368934745
123456789368934745 123456789381895013
123456789381895013 123456789447760867
123456789447760867 123456789466692531
123456789466692531 123456789470807304
123456789470807304 123456789504343451
123456789504343451 123456789571573964
123456789563853210 123456789666106771
123456789571573964 123456789683792216
123456789666106771 123456789719645070
123456789683792216 123456789747751420
123456789719645070 123456789770236822
123456789747751420 123456789839975896
123456789770236822 123456789920037815
123456789825288494 123456789930612286
123456789839975896 123456789936072949
123456789920037815 123456789948401617
123456789930612286 123456789982601470
123456789936072949
123456789948401617
123456789982601470
解决方案的结果应输出:
123456789825288494
123456789563853210
123456789239344137
table中的数据是 18 个字符长的数字序列,其中前 9 个数字不变。
编辑: 两个 table 都可以包含唯一值。结果应该 return 两个 table 中唯一的值。
假设您在单个数据库的不同表中都有这些列,那么使用 SQL 很容易解决这个问题。这是一种方法:
SELECT a.ID_TableA
FROM TableA a
LEFT JOIN TableB b
ON a.ID_TableA = b.ID_TableB
WHERE b.ID_TableB IS NULL
UNION
SELECT b.ID_TableB
FROM TableA a
RIGHT JOIN TableB b
ON a.ID_TableA = b.ID_TableB
WHERE a.ID_TableB IS NULL;
另一种方式,使用EXISTS
:
SELECT ID_TableA
FROM TableA a
WHERE NOT EXISTS (SELECT 1 FROM TableB b WHERE a.ID_TableA = b.ID_TableB)
UNION
SELECT ID_TableB
FROM TableA b
WHERE NOT EXISTS (SELECT 1 FROM TableA a WHERE a.ID_TableA = b.ID_TableB);
您可以使用 powerquery (Get & Transform Data
):
let
SourceA = Excel.CurrentWorkbook(){[Name="tblA"]}[Content],
SourceB = Excel.CurrentWorkbook(){[Name="tblB"]}[Content],
UniqueA = Table.Join(SourceA,{"ID_TableA"},SourceB,{"ID_TableB"},JoinKind.LeftAnti),
UniqueB = Table.Join(SourceA,{"ID_TableA"},SourceB,{"ID_TableB"},JoinKind.RightAnti),
OutputList = List.Combine({UniqueA[ID_TableA], UniqueB[ID_TableB]})
in
OutputList
(编辑看到您对 return 来自 EITHER table 的唯一值的要求)
做一些测试,使用一些类似格式的模拟数据,这看起来相当快:
Input from tblA Rows: 250,000 Input from tblB Rows: 250,000 Start: 25/10/2018 14:17:13 End: 25/10/2018 14:17:15 Returned 41,042 unique values in about 2 seconds
虽然我会像其他人建议的那样使用 Access 查询来做到这一点,但这是我对你的问题的 2 美分。
VLOOKUP
速度很慢而且不是正确的函数。
Countif
好一点,但 ISNUMBER(MATCH())
似乎是迄今为止最快的组合。
看看