创建一个新的 table 列,其中最接近另一个 table 的字符串匹配
Create a new table column with closest string match from another table
我有两个位置名称列表,拼写、大小写等略有不同
我正在尝试将第一个列表中的每个网站与第二个列表中最相似的网站进行匹配。
SELECT name1, name2 FROM table1, table2
WHERE levenshtein(name1, name2) < 3
是正确的,但抛出了一些误报。如果我可以 select 具有最小 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
中可行吗?
如果我对你的问题的理解正确,对于每个 name1
,你正在寻找最接近的 name2
。这可以通过子查询来完成,比如:
SELECT
name1,
(SELECT name2
FROM table2
WHERE levenshtein(name1, name2) < 3
ORDER BY levenshtein(name1, name2)
LIMIT 1
)
FROM table1
我假设你自己定义了 levenshtein
。
我有两个位置名称列表,拼写、大小写等略有不同
我正在尝试将第一个列表中的每个网站与第二个列表中最相似的网站进行匹配。
SELECT name1, name2 FROM table1, table2
WHERE levenshtein(name1, name2) < 3
是正确的,但抛出了一些误报。如果我可以 select 具有最小 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
中可行吗?
如果我对你的问题的理解正确,对于每个 name1
,你正在寻找最接近的 name2
。这可以通过子查询来完成,比如:
SELECT
name1,
(SELECT name2
FROM table2
WHERE levenshtein(name1, name2) < 3
ORDER BY levenshtein(name1, name2)
LIMIT 1
)
FROM table1
我假设你自己定义了 levenshtein
。