我是SQL的新手,因此我对它的功能不是很熟悉.
所以这是我的问题.
我的下表包含> 100.000公司(让我们称之为’comp’):
id | title | name ----+---------------------+-------------- 1 | XYZ | xyz ----+---------------------+-------------- 2 | Smarts | smarts ----+---------------------+-------------- 3 | XYZ LTD | xyzltd ----+---------------------+-------------- 4 | Outsmarts | outsmarts ----+---------------------+-------------- 5 | XYZ Entertainment | xyzentertainment ----+---------------------+-------------- 6 | Smarts Entertainment| smartsentertainment
其中’title’是公司名称,’name’是相同的标题,但是没有空格.
有没有办法找到所有具有相似头衔的公司(使用’title’或’name’)?所以,基本上,我想收到:
id | title | name ----+---------------------+-------------- 1 | XYZ | xyz ----+---------------------+-------------- 3 | XYZ LTD | xyzltd ----+---------------------+-------------- 5 | XYZ Entertainment | xyzentertainment ----+---------------------+-------------- 2 | Smarts | smarts ----+---------------------+-------------- 6 | Smarts Entertainment| smartsentertainment
我的意思是:
1)’XYZ’,’XYZ LTD’和’XYZ Entertainment’
2)’智能’和’智能娱乐’
但’XYZ Entertainment’与’Smart Entertainment’并不相似,’Smart’与’Outsmarts’不相似.
我尝试过这个并没有用:
SELECT set_limit(0.8);
SELECT
similarity(c1.name, c2.name) AS sim,
c1.name,
c2.name
FROM comp AS c1
JOIN comp AS c2
ON c1.name != c2.name
AND c1.name % c2.name
ORDER BY sim DESC;
通过’没有工作’我的意思是在7分钟后它仍然没有给我任何结果.我想,我完全搞砸了
是否有可能找回这样的相似之处?
最佳答案 您可以尝试
Levenshtein distance功能,它可以为您提供从第一个参数获得第二个的编辑次数:
SELECT levenshtein(c1.name, c2.name) AS sim, 0c1.name, c2.name
FROM comp AS c1 JOIN comp AS c2 ON c1.name != c2.name ORDER BY sim DESC;