【问题标题】:How to find similar values in one column with postgresql如何使用 postgresql 在一列中查找相似值
【发布时间】:2016-11-23 06:00:23
【问题描述】:


我是 SQL 的新手,因此对它的功能不是很熟悉。
所以这是我的问题。
我有超过 100.000 家公司的下表(我们称之为“comp”):

编号 |标题 |姓名 --+------------+-------------- 1 | XYZ | xyz --+------------+-------------- 2 |智慧 |聪明人 --+------------+-------------- 3 | XYZ有限公司| xyzltd --+------------+-------------- 4 |智者 |智胜 --+------------+-------------- 5 | XYZ 娱乐 | xyzenentertainment --+------------+-------------- 6 |智慧娱乐|智能娱乐

其中 '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


【解决方案1】:

您可以尝试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;

【讨论】:

  • 感谢您的回复,但它也失败了。我运行它,它只是加载我的数据库并且没有给出任何结果:SELECT levenshtein(c1.name, c2.name) AS sim, c1.name, c2.name FROM comp AS c1 JOIN comp AS c2 ON c1.name != c2.name ORDER BY sim DESC; 我可能是盲人,但错误在哪里?也许我应该检查“标题”,而不是“姓名”?
  • 是的,title 应该更好。我刚刚从您的第一篇文章中复制并修改了您的声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2019-02-14
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
相关资源
最近更新 更多