2013-07-17 2 views
0

У меня есть база данных заказов доступа, содержащий 500+ имена клиентов в поле под названием «CustomerName»Использование SQL для дедупликации, ВЫБРАТЬ аналогичные поля

Проблема заключается в том, что, как заказы получить введены, наша команда продаж иногда типы имен по-разному , («ACME Inc» против «ACME, Inc.»). Теперь у меня есть несколько клиентов, которые на самом деле являются одной и той же компанией, но выглядят по-разному.

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

Я в затруднении, как это сделать, любая помощь приветствуется.

Большое спасибо!

+2

посмотреть «расстояние от помех» или расстояние «левенштейна». оба являются полезными при определении того, как «разные» две строки. 'acme inc' и 'acme inc.' будет иметь очень короткие расстояния ветчины/лева. –

+0

Идти вперед, попробуйте нормализовать свои данные. Есть причина, по которой люди это делают ... –

ответ

1

можно разделить все столбцы клиента на «» и присоединиться к ним обратно с% в, как п Какой бы помочь найти ACME, Inc, потому что она будет соответствовать% Acme% Inc% вместе с ACME Inc

Its для меня трудно проверить это без огромной компании db с обманами, но, возможно, эта идея поможет.

+0

также выделяют знаки препинания как. и, - затем конвертировать во все верхние регистры - возможно, даже вычеркнуть общие аббревиатуры, такие как Inc, LLC, Corp – Randy

1

Это зависит от того, как имена меняются. Если это просто просто пунктуация, случай и т. Д., Вы можете лишить их и сделать сравнение на основе этого. Если его более сложный, например, «Inc, ACME» и «ACME Incorporated» вам нужно будет написать функцию, чтобы сравнить две строки для оценки/ранжирования.

Finding how similar two strings are

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

Levenshtein Distance in Excel

выше ссылка на SO вопрос, который имеет реализацию одного из методов в VBA

0

Этот синтаксис для SQL-сервера. Логика будет одинаковой для доступа. Я не уверен в синтаксисе. Это самостоятельное соединение.

select your fields 
from yourtable t1 join yourtable t2 
on left(t1.namefield, 10) = left(t1.namefield, 10) 
and t1.namefield <> t2.namefield 

Это дает вам записи, в которых первые 10 символов одинаковы. Однако, за то, что вы пытаетесь, я не думаю, что это достаточно основательно. Я думаю, вам нужно пройти весь свой db.

Кроме того, вы можете подумать об исправлении будущего, прежде чем исправить прошлое. Другими словами, сделайте что-то, чтобы предотвратить повторение, так что вам нужно только выполнить эту работу один раз.

1

У вас есть только 500 имен клиентов. Возьмите уникальные имена и поместите их в Excel. Сортируйте их и назначьте им «реальное» имя клиента.

Это займет меньше часа.

Затем загрузите это в новую таблицу в своей базе данных. Новая таблица будет иметь «настоящее имя клиента» и «альтернативные имена». При доступе к таблице выполните соединение, чтобы получить реальное имя.

Это устраняет непосредственную проблему.

Затем вы можете обновить данные в базе данных, чтобы использовать «настоящее» имя.

И, вы можете изменить способ ввода на один из следующих вариантов:

  • Есть люди продаж выбрать из списка допустимых имен. Или пройдите процесс, чтобы создать нового клиента.
  • Отклонить данные, загружаемые в систему, если имена клиентов не находятся в «реальном» списке. Затем вручную добавьте имя, если это настоящий новый клиент, и перезагрузите данные.

Вы имеете дело с 500 именами, а не 500 000 имен. Ручной процесс вполне возможен. Попытка заставить SQL выполнить аналогичные имена трудно. Вы потратите больше времени на это, чем на устранение проблемы.

Смежные вопросы