Как с помошью функции similarity заменить значения по определению схожести одного значения к другому в PostgreSQL?
День добрый, у меня проблем связанная с большим количеством опечаток в названии фирм/компаний и я хочу их объединить строго по определённым названиям бывает так что на одно название фирмы 20-30 похожих названий. Работаю с PostgreSQL 12.7. Например одна компания ее единственное верное название (OOO "VLADI") и исковерканные значения из за опечаток, и так еще со сотней разных фирм/компаний : "VLADI" , LTD "VLAD" , "vladi" , "vlad" и т.д. Думал использовать функцию similarity для определения схожести одного значения к другому и потом на основании схожести перезаписать данные на единственное верное (OOO "VLADI"). Таблица у меня "DataB" в ней столбец Compania , а также временная таблица compare со столбцом need ( в этом столбце указаны правильные названия фирм). Как сделать так что бы из столбца Compania самостоятельно вытаскивались значения и сравнивались со столбцом need в временной таблицей compare и заменялись. Благодаря пользователю «Mike» и «Roman Konoval» смог собрать вот ЭТО , но оно не работает как надо .
Вот примеры самой таблици:
Таблица №1 таблица DataB (то что есть)
| CountryCompanii | Compania |
|---|---|
| DE | OOO "VLADI" |
| DE | OOO "VLAD" |
| DE | OOO VLADI |
| DE | OOO VLAD |
| DE | "VLADI" |
| DE | "VLAD" |
| DE | LTD "VLAD" |
| DE | VLADI в германии |
| GB | ООО "LILYT" |
| GB | LTD "LILYT" |
| GB | LTD "LiLYT" |
| GB | LTD "Lilyt" |
| GB | LTD "LyLiT" |
Таблица №2 таблица DataB ( то, что должно быть)
| CountryCompanii | Compania |
|---|---|
| DE | OOO "VLADI" |
| DE | OOO "VLADI" |
| DE | OOO "VLADI" |
| DE | OOO "VLADI" |
| DE | OOO "VLADI" |
| DE | OOO "VLADI" |
| DE | OOO "VLADI" |
| DE | OOO "VLADI" |
| GB | ООО "LILYT" |
| GB | ООО "LILYT" |
| GB | ООО "LILYT" |
| GB | ООО "LILYT" |
| GB | ООО "LILYT" |
Также вот сам скрипт:
WITH compare (need) AS
(VALUES ('ООО "LILYT"'),('ООО VLADI')
),
UPDATE (Compania) as(
SELECT Compania, 'сравниваем с ' || need, similarity(Compania, need)
,DENSE_RANK() OVER (PARTITION BY need ORDER BY similarity(Compania, need) DESC)
AS "Ранжирование результатов"
FROM "DataB" CROSS JOIN "compare"
WHERE similarity(Compania, need) >0.25
)
UPDATE "DataB" SET Compania = need
FROM compare
Помогите ибо очень много времени тратится на ручную редакцию, если есть альтернативы по эффективнее , то буду рад о них узнать.