Замена значения по определению схожести одного значения к другому в PostgreSQL

День добрый, у меня проблем связаная с большим количеством опечаток в названии фирм/компаний и я хочу их объединить строго по определеним названиям бывает так что на одно название фирми 20-30 похожих названий. Работаю с PostgreSQL 12.7. Например одна компания ее единственое верное назавание (OOO "VLADI") и исковерканные значения из за опечаток и так еще со сотней разных фирм/компаний : "VLADI" , LTD "VLAD" , "vladi" , "vlad" и т.д. Думал использовать функцию similarity для определения схожести одного значения к другому и потом на основании схожести перезаписать дание на единственное верное (OOO "VLADI"). Таблица у меня "DataB" в ней столбец Compania. Как сделать так что бы из этого столбца самостоятельно витаскивались значения , сравнивались с таблицей в которой верное название и заменяло их в столбце Compania. благодоря пользователю "Mike" смог собрать вот ЭТО , но оно не подходит. Так как нужно вписивать все варианты названий , а я таким способом могу просто отдельно прописать UPDATE с WHERE я же хочу что би подобный процес обрабативался автоматически. + я намудрил с кодом компании из за этого проблеми с заменой.

WITH "DataB" (CodCompanii,Compania) AS (
     VALUES (1, 'ООО "РОМАШКА"')
     ,(2, 'ООО РОМАШКА')
     ,(3, 'ООО "РОМАШка"')
     ,(4, 'ООО РаМАШКА')
     ,(5, 'ЗАО VLaD')
     ,(6, 'ООО VLAD I')
     ,(7, 'ООО VLAd')
     ,(8, 'ZAO VLDI')
     ,(9, 'LTD VI')
     ,(10, 'Vlad')
     ,(11, 'ООО VLADI')
     ),
compare (CodC, need) AS
     (VALUES ('1200', 'ООО "РОМАШКА"'),('1050', 'ООО VLADI')
),
UPDATE (CodCompanii,Compania)  as(
SELECT CodCompanii,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 WHERE CodC = CodCompanii


Ответы (1 шт):

Автор решения: Roman Konoval

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

Если запрос в принципе делает то, что вам нужно и поля в реальной таблице называются так же как в примере, то вам достаточно удалить часть запроса, где создается CTE DataB:

WITH compare (CodC, need) AS
     (VALUES ('1200', 'ООО "РОМАШКА"'),('1050', 'ООО VLADI')
),
UPDATE (CodCompanii,Compania)  as(
SELECT CodCompanii,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 WHERE CodC = CodCompanii
→ Ссылка