微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检测并填写PostgreSQL街道地址数据中的缺失数据

如何解决检测并填写PostgreSQL街道地址数据中的缺失数据

我有一个由公共数据源构建的芬兰街道地址数据库。格式为<street name> <number> [<a possible suffix of letters and dashes>],例如Aurakatu 8Aurakatu 12b。在对源数据进行一些过滤以除去异常或垃圾数据之后,数据库大约有180万行。其中大约195k包含后缀。

源数据合理但不完整。我要处理的问题是:街道名称+数字组合存在IRL(例如Aurakatu 12),但数据仅包含带字母后缀的形式(Aurakatu 12aAurakatu 12b )。这三种形式均有效,例如指向Google Maps中的离散位置。

总而言之,这就是我要实现的目标:在地址表中找到每个街道名称+数字组合,其中只有带后缀的版本存在,并创建一个无后缀的条目。

在上述示例中,一个或多个查询将发现对于假设的Aurakatu 12街道名称/号码组合,仅存在后缀版本12a12b,并且会创建普通的12版本。

在设置(或显着更新)服务器实例时,数据导入很少进行,因此最大的效率不是最重要的。

street_namenumberaddresses表中单独的表列。数字本身不一定是连续的。通常存在Somestreet 24之类但不存在Somestreet 25之类的东西。

解决方法

考虑:

insert into addresses (street_name,street_number)
select street_name,regexp_replace(street_number,'\D+$','')
from addresses
group by 1,2
having count(*) filter(where street_number ~ '\d$') = 0

regexp_replace()表达式在字符串末尾去除(潜在的)尾随非数字字符;然后,查询会将所有具有相同street_name和(剥离的)street_number的行分组在一起。然后,having子句会过滤掉已经包含后缀street_number(即以数字结尾的街道号码)的组:将剩余的内容插入到表中。

您可以(并且应该!)首先独立运行select查询以查看将要插入的内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。