Найти дубликаты в большом наборе данных Excel - PullRequest
0 голосов
/ 25 октября 2018

У меня есть эта задача, которая, кажется, повторяется, и мне нужно лучшее решение для.

Я извлекаю данные из двух разных баз данных в двух разных системах (не спрашивай почему, просто так).Когда я делаю это, желательно, чтобы два набора данных были одинакового размера.У меня есть первичный ключ на обоих, давайте назовем этот «идентификатор».Что я хочу сделать, это проверить этот идентификатор из таблиц1 и таблиц2 и получить уникальные значения (так что я могу пойти дальше и посмотреть, почему у меня есть больше в одной таблице).Мой набор данных становится очень большим (примерно более 100 000 строк), что делает мою функцию VLOOKUP в Excel чрезвычайно медленной.Есть ли способ решить эту проблему в Excel с speed ?Решения, использующие макрос VBA, сводные таблицы или превосходящий встроенный SQL, вполне подойдут.Использование Excel 2016.

Пример таблицы:

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

Данные в таблицах представляют собой серию чисел длиной 18 символов, гдепервые 9 цифр не меняются.

Редактировать: Обе таблицы могут содержать уникальные значения.Результат должен возвращать значения, уникальные для обеих таблиц.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы можете использовать (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

(Отредактировано, увидев ваше требование вернуть уникальные значения из таблицы EITHER)

При некотором тестировании с использованием макетов данных в аналогичном формате это выглядит довольно быстро:

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
0 голосов
/ 25 октября 2018

Хотя я бы сделал это с помощью запроса Access, как предлагали другие, вот мои 2 цента за ваш вопрос.

VLOOKUP - это медленная и не подходящая функция для этого.
Countifнемного лучше, но ISNUMBER(MATCH()) кажется самой быстрой комбинацией на сегодняшний день.
Посмотрите на https://stackoverflow.com/a/29983885/78522

0 голосов
/ 25 октября 2018

Если у вас есть оба этих столбца в отдельных таблицах в одной базе данных, то эту проблему легко решить с помощью 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);
...