Как сравнить 2 столбца с похожими данными (например, не в том же порядке, с запятой) - PullRequest
0 голосов
/ 04 марта 2020

Я имею дело с грязной базой данных, которая не имеет нормализованных данных и имеет столбец с именем типа

"Джон Кевин Смит" , который мне нужно сравнить с другим столбец (из другой таблицы), который может иметь «Кевин Джон Смит» или «Смит, Кевин Джон» или такой же, как оригинал, и на основании этого мне нужно выяснить, если они указывают на одну и ту же запись.

Я пытаюсь выяснить, как это сделать с SQL Server 2012.

Я безуспешно проверял функцию JaroWinkler, я также пробовал с функцией fnSplit, но это, похоже, не сработало, я думаю, мне, возможно, придется сначала как-то нормализовать их, затем разделить их все, а затем сравнить между собой, но я рисую пробел в процессе.

Есть какие-нибудь предложения?

ОБНОВЛЕНИЕ:

с функцией разделения и некоторые замены, я могу "нормализовать" столбцы и получить результаты в табличной функции, например это:

enter image description here

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

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Для сравнения вы можете просто использовать предложение EXISTS.

Пример данных

CREATE TABLE TEST(
    VAL_A varchar(200),
    VAL_B varchar(200)
);

INSERT INTO TEST (VAL_A, VAL_B) VALUES
('john kevin smith', 'Kevin john smith'),
('john kevin smith', 'Kevin, john smith'),
('Alpha beta gamma', 'beta delta alpha');

Запрос:

SELECT VAL_A, VAL_B
FROM TEST
WHERE NOT EXISTS (
    SELECT value FROM [dbo].[fn_Split](VAL_A, ' ')
    EXCEPT 
    SELECT value FROM [dbo].[fn_Split]((REPLACE(VAL_B,',','')), ' ')
)
OR 
NOT EXISTS (
    SELECT value FROM [dbo].[fn_Split]((REPLACE(VAL_B,',','')), ' ')
    EXCEPT 
    SELECT value FROM [dbo].[fn_Split](VAL_A, ' ')

Это вернет совпадающие строки.

+-------------------+-------------------+
| VAL_A             | VAL_B             |
+-------------------+-------------------+
| john kevin smith  | Kevin john smith  |
| john kevin smith  | Kevin, john smith |
+-------------------+-------------------+

в выводе, вы можете заметить, что комбинация alpha,beta,gamma,delta не отображается как не совпадают. Вы можете изменить NOT EXISTS на EXISTS, если хотите, чтобы строки не совпадали.

ПРОВЕРЬТЕ ДЕМО ЗДЕСЬ

Вы можете использовать joins если другой столбец идет из другой таблицы. Также используйте операторы REPLACE соответственно.

0 голосов
/ 04 марта 2020

Просто идея ... что вы можете сделать, это найти и заменить все пробелы запятой для этого поля в каждой таблице. Поместите результаты каждой таблицы в отдельную таблицу #temp. Как только вы это сделаете .. выполните string_split (из fnSplit) в зависимости от SQL версии и порядка, а затем в алфавитном порядке.

Теперь объедините эти таблицы на основе значения столбца и посмотрите, где вы получите

0 голосов
/ 04 марта 2020

Вы можете использовать STRING_SPLIT ()

Табличную функцию, которая разбивает строку на строки подстрок на основе указанного символа-разделителя

SELECT a.Value
FROM STRING_SPLIT('john kevin smith', ' ') a
INNER JOIN STRING_SPLIT('Kevin john smith', ' ') b on a.Value = b.Value

Демонстрация здесь

enter image description here

...