模糊合并两个表postgresql

时间:2013-12-07 03:57:24

标签: postgresql merge fuzzy

我需要根据名称加入两个表。问题是名称可能在其中一个数据库中有轻微的错误。我过去使用Stata和Python的模糊合并来解决这个问题,其中名称根据它们的相似程度进行匹配,但我想知道这是否可以在Postgresql中进行。

例如,数据可能与此类似:

表A:

first_name_a | last_name_a | id_a
----------------------------------
   William   |   Hartnell  | 1
   Matt      |   Smithe    | 2
   Paul      |   McGann    | 3
   David     |   Tennant   | 4
   Colin     |   Baker     | 5

表B:

first_name_b | last_name_b | id_b
----------------------------------
   Matt      |   Smith     | a
   Peter     |   Davison   | b
   Dave      |   Tennant   | c
   Colin     |   Baker     | d
   Will      |   Hartnel   | e

最后,我希望我的结果看起来像:

first_name_a | last_name_a | id_a | first_name_b | last_name_b | id_b
----------------------------------------------------------------------
 William     |  Hartnell   |  1   |  Will        | Hartnel     | e
 Matt        |  Smithe     |  2   |  Matt        | Smith       | a
 Paul        |  McGann     |  3   |              |             | 
 David       |  Tennant    |  4   |  Dave        | Tennant     | c
 Colin       |  Baker      |  5   |  Colin       | Baker       | d
             |             |      |  Peter       | Davison     | b

我的声波螺丝刀给了我一些像这样的伪代码:

SELECT a.*, b.* FROM A a
     JOIN B b
     WHERE LEVENSHTEIN(first_name_a, first_name_b) IS LESS THAN 1
     AND LEVENSHTEIN(last_name_a, last_name_b) IS LESS THAN 1

2 个答案:

答案 0 :(得分:2)

你提到的DML:

SELECT a.*, b.* FROM A a
 JOIN B b
 WHERE LEVENSHTEIN(first_name_a, first_name_b) IS LESS THAN 1
 AND LEVENSHTEIN(last_name_a, last_name_b) IS LESS THAN 1

看起来是正确的,只是提高了'模糊性'(给出'不到1'代替1你所需要的'模糊'水平)

有关LEVENSHTEIN的参考信息,请参阅http://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html

答案 1 :(得分:0)

完成SQLFiddle。使用阈值/查看matching fuzzy strings中提到的一些其他映射函数。