替换无效的邮政编码。
考虑以下数据集:
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
答案 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怎么办?
获得该功能的唯一方法是验证完整地址。