[英]Filling missing dates in each group while querying data from PostgreSQL
[英]Detecting and filling in missing data in PostgreSQL street address data
我有一個從公共數據源構建的芬蘭街道地址數據庫。 格式為<street name> <number> [<a possible suffix of letters and dashes>]
,例如Aurakatu 8
或Aurakatu 12b
。 在對源數據進行一些過濾以去除異常或垃圾數據后,DB 大約有 1.8M 行。 其中大約 195k 包含后綴。
源數據合理但不完整。 我要處理的問題是:街道名稱 + 號碼組合存在 IRL(例如Aurakatu 12
),但數據僅包含字母后綴形式( Aurakatu 12a
和Aurakatu 12b
)。 例如,所有三種形式都是有效的,並且指向 Google 地圖中的離散位置。
總而言之,這就是我想要實現的目標:在地址表中找到每個街道名稱 + 號碼組合,其中只存在后綴版本,並創建一個非后綴條目。
在上述示例的情況下,一個或多個查詢會發現對於假設的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()
表達式regexp_replace()
字符串末尾的(潛在)尾隨非數字字符; 然后查詢將具有相同street_name
和(剝離) street_number
所有行組合在一起。 在having
條款,然后過濾掉已經包含了無后綴組street_number
(即以數字結束街道號碼):剩下的是插入到表中。
您可以(並且應該!)首先獨立運行select
查詢以查看將插入的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.