Моя команда и я заинтересованы в определении наилучшего способа сопоставления двух разных наборов данных. Нет никаких ключей, к которым можно присоединиться, поскольку эти данные поступают из двух отдельных источников, которые ничего не знают друг о друге. Мы импортируем эти данные в две таблицы оракула, и как только это будет сделано, мы можем начать искать совпадения.Oracle - найти лучшее совпадение между двумя таблицами
Обе таблицы содержат полный список свойств (как в недвижимости). Нам нужно сопоставить свойства в таблице 1 с любыми потенциальными соответствиями, найденными в таблице2. Для каждой записи в таблице 1 найдите таблицу2 для потенциального совпадения и определите вероятность совпадения. Моя команда и я решили, что лучший способ сделать это - сравнить поля Address с каждой из двух таблиц.
Единственный улов в том, что таблица 1 предоставляет адрес в формате Parsed и выделяет номер адреса, адрес Street и даже Address_type в отдельные столбцы, тогда как в таблице 2 содержится только один столбец для хранения адреса. Каждая таблица имеет столбцы City, State и Zip, которые можно сравнить отдельно.
Для примера - смотрите ниже Table1 и Table2:
Обратите внимание, что первичные ключи в моих таблицах псевдослучайных ниже являются Key1 и Key2 соответствующие таблицы они находятся в
+---------------+---------------+---------------+---------------+---------------+-------+-------+
+ + TABLE1 + + + + + +
+---------------+---------------+---------------+---------------+---------------+-------+-------+
| Key1 | Addr_Number | Addr_Street | Addr_Type | City | State | Zip |
+---------------+---------------+---------------+---------------+---------------+-------+-------+
| 1001 | 148 | Panas | Road | Robinson | CA | 76050 |
| 1005 | 110 | 48th | Street | San Juan | NJ | 8691 |
| 1009 | 8571 | Commerce | Loop | Vallejo | UT | 83651 |
| 1059 | 714 | Nettleton | Avenue | Vista | TX | 29671 |
| 1185 | 1587 | Orchard | Drive | Albuquerque | PA | 77338 |
+---------------+---------------+---------------+---------------+---------------+-------+-------+
+---------------+----------------------+---------------+---------------+---------------+
+ + TABLE2 + + + +
+---------------+----------------------+---------------+---------------+---------------+
| Key2 | Address | City | State | Zip |
+---------------+----------------------+---------------+---------------+---------------+
| Ax89f | 148 Panas Road | Robinson | CA | 76050 |
| B184a | 110 48th Street | San Juan | NJ | 08691 |
| B99ff | 8571 Commerce Lp | Vallejo | UT | 83651 |
| D81bc | 714 Nettleton Ave | Vista | TX | 29671 |
| F84a2 | 1587 Orachard Dr | Albuquerqu | PA | 77338 |
+---------------+----------------------+---------------+---------------+---------------+
Целью здесь является. предоставить пользователю выход, который просто отображает ВСЕ записи из Таблицы 1 и самую высокую согласованную запись, найденную в Таблице 2. Разумеется, может быть найдено много записей, которые могут быть потенциальным совпадением, но мы хотим сохранить это отношение один к одному и не производить Duplicates в этом исходном выпуске. Вывод должен быть только одним записям из таблицы, сопоставленным с лучшим поиском в таблице 2.
Ниже пример требуемой выходной я пытающегося создать:
+--------+-------+----------------+---------------------------+
+ + + Matched_Output + +
+--------+-------+----------------+---------------------------+
| Key1 | Key2 | Percent_Match | num_Matched_Records > 90% |
+--------+-------+----------------+---------------------------+
| 1001 | Ax89f | 100% | 5 | --All Parsed Values Match
| 1005 | B184a | 98% | 4 | --Zip Code prefixed with Zero in Table 2
| 1009 | B99ff | 95% | 3 | --Loop Vs Lp
| 1059 | D81bc | 95% | 2 | --Avenue Vs Ave
| 1185 | F84a2 | 97% | 2 | --City Spelled Wrong in Table 2 and Drive vs Dr
+--------+-------+----------------+---------------------------+
В выходе я хочу видеть Key1 из Table1 и согласованной записи прямо рядом с ним, показывая, что он совпадает с записью в таблице 2 - Key2. Затем нам нужно знать, насколько хорошо эти две записи совпадают. В таблице 2 может быть много записей, которые показывают вероятность сопоставления записей в таблице 1. Фактически каждой отдельной записи в таблице 2 может быть присвоен процент от 0% до 100% соответствия.
Итак, теперь на главный вопрос: Как получить этот процент?
Как проанализировать столбец «Адрес» в таблице2, чтобы я мог сравнивать каждый из отдельных столбцов, которые составляют адрес в таблице1, а затем применить алгоритм сравнения для каждого анализируемого значения?
Пока это моя команда и я придумали (Мозговой штурм, Spitballin, все, что вы хотите назвать).
Мы рассмотрели пару встроенных функций Oracle, чтобы получить проценты, которые мы ищем, а также пытаемся использовать регулярные выражения. Если бы я мог попасть в Google и получить некоторые из своих алгоритмов поиска, я бы это сделал. Очевидно, у меня нет такой роскоши, и я должен ее создать.
regexp_count(table2_city,'(^|)'||REPLACE(table1_city,' ','|')||'($|)') city_score,
regexp_count(table2_city,'(^|)') city_max,
to_char((city_score/city_max)*100, '999G999G999G999G990D00')||'%' city_perc,
Выше было только то, что мы с моей командой использовали в качестве доказательства концепции. Мы просто выбрали эти значения из двух таблиц и запустили функцию 'regexp_count' против этих столбцов.Вот несколько других функций, которые мы рассмотрели:
SOUNDEX
REGEXP_LIKE
regexp_replace
Эти функции являются большими, но я не уверен, что они могут быть использованы в одном Запрос между обеими таблицами для получения желаемого результата.
Другая идея состоит в том, что мы могли бы создать функцию(), которая в качестве своих параметров принимает поля «Адрес», которые мы хотим использовать для сравнения. Затем эта функция будет искать таблицу 2 для наивысшего вероятного соответствия и вернуть пользователю значение Key2 из таблицы2.
Функция (Addr_Number, Addr_Street, Addr_type, город, штат) ВОЗВРАТ table2.key2
Например, может быть что-то вроде этого 'может' работать:
Select tb1.key1, table2Function(tb1.Addr_Number, tb1.Addr_Street, tb1.Addr_type, tb1.City, tb1.State) As Key2
From Table1 tb1;
Наконец, просто знаю, что в таблицах 1 и 20k в таблице 2 имеется примерно 15 тыс. записей. Снова ... каждая запись в Таблице 1 должна быть проверена против каждой записи в Таблице 2 для потенциального соответствия.
Я все уши. И заблаговременно за ваши отзывы.
Как я и предложил в своем ответе, может иметь смысл взвесить отдельные баллы в конечном счете - дать (очень?) Большой вес в состояние и почтовый индекс и (относительно) более низкий балл в город по причинам Я дал там. – mathguy
Это абсолютно идеально. Я не вернусь к работе до вторника, но я хотел проверить ваше решение, как только мог, я развернул свою базу данных Oracle Express дома и выполнил ваш запрос. Оно прекрасно. Соединение справа от функции sys.utl_match действительно круто. Спасибо за советы, и я с нетерпением жду изучения этого пакета. –