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

Detecting and filling in missing data in PostgreSQL street address data

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

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

总而言之,这就是我要实现的目标:找到地址 table 中仅存在后缀版本的每个街道名称 + 号码组合,并创建一个无后缀条目。

在上面的示例中,查询会发现对于假设的 Aurakatu 12 街道 name/number 组合,只有后缀版本 12a12b存在,并将创建普通 12 版本。

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

street_namenumberaddresses table 中单独的 table 列。数字本身不一定是连续的; 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() 表达式去除字符串末尾的(潜在的)尾随 non-digit 字符;然后查询将具有相同 street_name 和(剥离)street_number 的所有行组合在一起。然后 having 子句过滤掉已经包含无后缀 street_number(即以数字结尾的街道号码)的组:剩下的插入到 table.

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