SQL для дедупликации нечетких соответствий - PullRequest
0 голосов
/ 06 сентября 2018

Таблица A содержит записи с дублирующимися объектами с тонкими вариациями строк. Не существует уникального ключа, который бы однозначно идентифицировал сущность. Поле «ID» идентифицирует запись внутри таблицы, но не сам объект.

    TABLE A
    --------------
    ID;SomeString
    1;something1
    2;something2
    3;something3

При использовании программного обеспечения нечеткого сопоставления таблица A нечетко сопоставляется с самим собой, чтобы обнаружить дублирующиеся записи. Так создается таблица поиска, которая имеет два столбца: ID1 и ID2, представляющие идентификаторы совпадающих записей из таблицы A.

    TABLE B
    ---------
    ID1;ID2
    1;2
    1;3
    2;1
    2;3
    3;1
    3;2

Результатом дедупликации будет удаление записей 2 и 3 из таблицы A. Таким образом, будет сохранена только первая запись.

    TABLE A
    --------------
    ID;SomeString
    1;something1

Есть ли способ выполнить такую ​​дедупликацию нечетких совпадений таблиц от A до SQL, используя таблицу B в качестве таблицы поиска нечетких совпадений для идентифицированных повторяющихся записей? Чтобы уточнить, я не спрашиваю, как сделать нечеткое совпадение или идентифицировать дубликаты, это уже сделано, и результаты приведены в таблице B. Я спрашиваю, как выполнить удаление дубликатов (и сохранить одну запись на идентифицированные дублирующиеся записи). группа), в соответствии с уже идентифицированными парами повторяющихся записей (несколько пар повторяющихся записей на одну и ту же сущность).

1 Ответ

0 голосов
/ 07 сентября 2018

Основная проблема, которую я вижу, состоит в том, что ваша таблица нечетких совпадений содержит повторяющиеся пары с обратным порядком идентификаторов. Это означает, что у вас есть строки, чтобы сказать, что оба 2 являются дубликатом 1, а 1 - дубликатом 2. Если вы удалили все строки на основе столбца ID2 в таблице B, вы просто удалите все строки в таблице. A.

Эту проблему можно решить с помощью оператора select, который переставляет столбцы так, чтобы меньший идентификатор всегда был первым. Таким образом, предыдущий пример «2 является дубликатом 1, а 1 - дубликатом 2» становится просто повторением «2 - дубликатом 1». В этот момент вы можете выбрать различные значения, чтобы получить список идентификаторов, которые нужно удалить из таблицы A.

На основании ваших данных выборки этот запрос удалил правильные значения:

WITH Duplicates (ID) AS
(
    SELECT DISTINCT 
        CASE
            WHEN ID1 > ID2 THEN ID1
            WHEN ID2 > ID1 THEN ID2
        END AS Duplicate
    FROM Table_B
)

DELETE
FROM Table_A
WHERE ID IN (SELECT * FROM Duplicates)
...