匹配类似的邮政编码

时间:2010-10-01 14:28:16

标签: sql postgresql

背景

替换无效的邮政编码。

样本数据

考虑以下数据集:

 Typo  | City       | ST | Zip5
-------+------------+----+------
 33967 | Fort Myers | FL | 33902
 33967 | Fort Myers | FL | 33965
 33967 | Fort Myers | FL | 33911
 33967 | Fort Myers | FL | 33901
 33967 | Fort Myers | FL | 33907
 33967 | Fort Myers | FL | 33994
 34115 |Marco Island| FL | 34145
 34115 |Marco Island| FL | 34146
 86405 |  Kingman   | FL | 86404
 86405 |  Kingman   | FL | 86406

33967与33965紧密匹配,尽管33907也可能是正确的。 (在这种情况下,33967是有效的邮政编码,但不在我们的邮政编码数据库中。)

34115紧密匹配是34145(关闭一位数,该数字相差3)。

86405与两者非常匹配。

有时数字只是反转(例如,89而不是98)。

问题

你如何编写一个SQL语句,找到具有相同位数的多个数字之间的“最小距离”,无论如何最多返回一个结果?

  • 减去数字。
  • 使用LIMIT 1

条件

PostgreSQL 8.3

2 个答案:

答案 0 :(得分:5)

这听起来像Levenshtein distance

  

两个人之间的Levenshtein距离   字符串定义为最小值   转换所需的编辑次数   一个字符串进入另一个,用   允许的编辑操作   插入,删除或替换   单个角色。

看起来PostgreSQL内置了它:

test=# SELECT levenshtein('GUMBO', 'GAMBOL');
 levenshtein
-------------
           2
(1 row)

http://www.postgresql.org/docs/8.3/static/fuzzystrmatch.html

答案 1 :(得分:2)

Redfilter回答了被问到的问题,但我只是想澄清所请求的解决方案无法解决看似真正的问题。

这里真正的问题似乎是你有一个手动键入的数据库,一些数字被转录为垃圾数据。

解决此问题的唯一方法是针对USPS,MapQuest或其他提供程序等数据库验证完整地址。我知道前两个有API可用于此。

我在上面的评论中给出的例子是考虑75084的拉链和Richardson的城市价值。 Richardson的邮政编码范围为75080,81,82,83和85.最小编辑数量为1.但是,哪一个?

另一个同样的问题是,如果输入的邮政编码是理查森的75083。哪个是该城市的有效邮政编码;但是,如果地址存在75082怎么办?

获得该功能的唯一方法是验证完整地址。