检测并填充 PostgreSQL 街道地址数据中的缺失数据
Detecting and filling in missing data in PostgreSQL street address data
我有一个从 public 数据源构建的芬兰街道地址数据库。格式为 <street name> <number> [<a possible suffix of letters and dashes>]
,例如Aurakatu 8
或 Aurakatu 12b
。在对源数据进行一些过滤以删除异常或垃圾数据之后,数据库大约有 1.8M 行。其中大约 195k 包含后缀。
源数据合理但不完整。我要处理的问题是:街道名称 + 数字组合存在 IRL(例如 Aurakatu 12
),但数据仅包含字母后缀形式(Aurakatu 12a
和 Aurakatu 12b
).例如,这三种形式均有效并指向 Google 地图中的离散位置。
总而言之,这就是我要实现的目标:找到地址 table 中仅存在后缀版本的每个街道名称 + 号码组合,并创建一个无后缀条目。
在上面的示例中,查询会发现对于假设的 Aurakatu 12
街道 name/number 组合,只有后缀版本 12a
和 12b
存在,并将创建普通 12
版本。
设置(或显着更新)服务器实例时很少运行导入数据,因此最大效率并不重要。
street_name
和 number
是 addresses
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
首先独立查询以查看将插入的内容。
我有一个从 public 数据源构建的芬兰街道地址数据库。格式为 <street name> <number> [<a possible suffix of letters and dashes>]
,例如Aurakatu 8
或 Aurakatu 12b
。在对源数据进行一些过滤以删除异常或垃圾数据之后,数据库大约有 1.8M 行。其中大约 195k 包含后缀。
源数据合理但不完整。我要处理的问题是:街道名称 + 数字组合存在 IRL(例如 Aurakatu 12
),但数据仅包含字母后缀形式(Aurakatu 12a
和 Aurakatu 12b
).例如,这三种形式均有效并指向 Google 地图中的离散位置。
总而言之,这就是我要实现的目标:找到地址 table 中仅存在后缀版本的每个街道名称 + 号码组合,并创建一个无后缀条目。
在上面的示例中,查询会发现对于假设的 Aurakatu 12
街道 name/number 组合,只有后缀版本 12a
和 12b
存在,并将创建普通 12
版本。
设置(或显着更新)服务器实例时很少运行导入数据,因此最大效率并不重要。
street_name
和 number
是 addresses
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
首先独立查询以查看将插入的内容。