【发布时间】:2016-11-23 06:00:23
【问题描述】:
我是 SQL 的新手,因此对它的功能不是很熟悉。
所以这是我的问题。
我有超过 100.000 家公司的下表(我们称之为“comp”):
其中 'title' 是公司名称,而 'name' 是相同的标题,但小写且没有空格。 有没有办法找到所有具有相似头衔的公司(使用“头衔”或“名称”)?所以,基本上,我想收到:
编号 |标题 |姓名 --+------------+-------------- 1 | XYZ | xyz --+------------+-------------- 3 | XYZ有限公司| xyzltd --+------------+-------------- 5 | XYZ 娱乐 | xyzenentertainment --+------------+-------------- 2 |智慧 |聪明人 --+------------+-------------- 6 |智慧娱乐|智能娱乐我的意思是:
1) “XYZ”、“XYZ LTD”和“XYZ 娱乐”
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 分钟后它仍然没有给我任何结果。我想,我完全搞砸了
甚至有可能检索到这样的相似之处吗?
【问题讨论】:
-
在您的示例中,相似的值对应于同一行。您是否还需要在不同的行中找到两个相似的值?
-
这实际上是一个 100k 表的交叉连接。预计它会非常缓慢。但请务必发布解释输出
-
@FDavidov 我已经更新了问题
-
好的,好的.... 让我们暂时搁置您如何表达 SELECT 命令。该任务需要执行 100,000 * 99,999 次字符串比较,99.99 亿次比较。你预计这需要多长时间?假设您的服务器每秒可以执行 10,000 次此类比较,您仍然需要大约 11.5 小时。在继续寻找解决方案之前,只需进行数学运算。
-
@FDavidov,是的,我明白这一点。我在问这是否可能。如果可能的话,也许有更优雅和明显的解决方案)
标签: sql postgresql