【问题标题】:Detecting and filling in missing data in PostgreSQL street address data检测和填充 PostgreSQL 街道地址数据中的缺失数据
【发布时间】:2020-08-31 14:24:37
【问题描述】:

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

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

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

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

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

street_namenumberaddresses 表中的单独表列。数字本身不一定是连续的; Somestreet 24 这样的东西存在但Somestreet 25 不存在是很常见的。

【问题讨论】:

    标签: sql string postgresql count sql-insert


    【解决方案1】:

    考虑:

    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 查询,看看会插入什么。

    【讨论】:

    • 这将在第 4 行为 count(*) 后面的第一个括号生成 ERROR: syntax error at or near "(",同时单独运行 SELECT 查询。从最后一个正则表达式比较中删除括号只会导致语法错误出现在 street_number 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多