如何解决检测并填写PostgreSQL街道地址数据中的缺失数据
我有一个由公共数据源构建的芬兰街道地址数据库。格式为<street name> <number> [<a possible suffix of letters and dashes>]
,例如Aurakatu 8
或Aurakatu 12b
。在对源数据进行一些过滤以除去异常或垃圾数据之后,数据库大约有180万行。其中大约195k包含后缀。
源数据合理但不完整。我要处理的问题是:街道名称+数字组合存在IRL(例如Aurakatu 12
),但数据仅包含带字母后缀的形式(Aurakatu 12a
和Aurakatu 12b
)。这三种形式均有效,例如指向Google Maps中的离散位置。
总而言之,这就是我要实现的目标:在地址表中找到每个街道名称+数字组合,其中只有带后缀的版本存在,并创建一个无后缀的条目。
在上述示例中,一个或多个查询将发现对于假设的Aurakatu 12
街道名称/号码组合,仅存在后缀版本12a
和12b
,并且会创建普通的12
版本。
在设置(或显着更新)服务器实例时,数据导入很少进行,因此最大的效率不是最重要的。
street_name
和number
是addresses
表中单独的表列。数字本身不一定是连续的。通常存在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 举报,一经查实,本站将立刻删除。