使用另一个表中最接近字符串匹配的新表列创建

时间:2016-09-13 17:02:33

标签: postgresql levenshtein-distance fuzzy-comparison

我有两个地点名称列表,拼写,大写等略有不同。

我正在尝试将第一个列表中的每个网站与第二个列表中最相似的网站进行匹配。

SELECT name1, name2 FROM table1, table2
    WHERE levenshtein(name1, name2) < 3

沿着正确的路线行进,却引发了一些误报。如果我可以选择Levenshtein距离最小的记录,那么大多数都会被避免。

在Python中,我希望这样做:

for row1 in table1:
    min_dist = 100
    for row2 in table2:
        dist = levenshtein(row1.name, row2.name)
        if dist < min_dist:
            min_dist = dist
            closest_name = row2.name
    row1.newcolumn = closest_name

这可能在postgresql吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,对于每个name1,您正在寻找最接近的name2。这可以通过子查询完成,类似:

SELECT
    name1,
    (SELECT name2
     FROM table2
     WHERE levenshtein(name1, name2) < 3
     ORDER BY levenshtein(name1, name2)
     LIMIT 1
    )
FROM table1

我假设你自己定义了levenshtein