簡體   English   中英

從 Bigquery 中的地址字符串中提取郊區名稱

[英]Extract suburb name from address string in Bigquery

我有一個地址(屬性)表,我只需要從中提取郊區名稱。 我有另一個包含所有郊區名稱的表(郊區)。

我遇到了多詞郊區名稱的問題,其中一個詞和兩個詞都匹配。 我需要它與最長的郊區名稱相匹配,例如。 帶有“North Bondi”的地址應該只匹配郊區“North Bondi”而不是郊區“Bondi”。

我在網上找到了一些在連接中使用 MAX function 的示例,但 Bigquery 不允許我在連接中使用 function。

如果有人可以提出更正建議或提供有關其他解決方案的指導(例如,對郊區表進行排序並僅檢索一個結果?),將不勝感激!謝謝!

表:屬性

地址
12 Smith Street Surry Hills NSW
新南威爾士州邦迪瓊斯街 34 號
15 Sunny Road North Bondi NSW

表:郊區

市郊 state
薩里山 新南威爾士州
邦迪 新南威爾士州
北邦迪 新南威爾士州

當前使用的代碼:

Select * from  ( SELECT p.address, s.suburb 
       FROM `property` p
       JOIN `suburbs` s
         ON INITCAP(p.address) LIKE CONCAT('%', INITCAP(s.suburb),' ', INITCAP(s.state), '%')
      GROUP BY p.address, s.suburb
   ) x
join `property` p
ON p.address = x.address
where p.address is not null;

實際結果:

地址 市郊
12 Smith Street Surry Hills NSW 薩里山
新南威爾士州邦迪瓊斯街 34 號 邦迪
15 Sunny Road North Bondi NSW 邦迪
15 Sunny Road North Bondi NSW 北邦迪

期望的結果:

地址 市郊
12 Smith Street Surry Hills NSW 薩里山
新南威爾士州邦迪瓊斯街 34 號 邦迪
15 Sunny Road North Bondi NSW 北邦迪

嘗試這個:

select  v1.address,
        string_agg(v1.addr_part, " ") as suburb,
from    (
          select  t.address,
                  addr_part,
          from    property t
          cross join unnest(split(t.address, " ")) addr_part WITH OFFSET AS ofst
          where   ofst > 2
          qualify row_number() over(partition by t.address order by ofst desc) > 1
        ) v1
group by v1.address
;

但是:這種方法假設:

  1. 每個地址的前三個字不屬於郊區名稱;
  2. 每個 state 是一個字。

我在網上找到了一些在連接中使用 MAX function 的示例,但 Bigquery 不允許我在連接中使用 function。

使用 window function 而不是MAX function,

Select * from  ( SELECT p.address, s.suburb 
       FROM `property` p
       JOIN `suburbs` s
         ON INITCAP(p.address) LIKE CONCAT('%', INITCAP(s.suburb),' ', INITCAP(s.state), '%')
   ) x
QUALIFY RANK() OVER (PARTITION BY address ORDER BY LENGTH(suburb) DESC) = 1

查詢結果:

地址 市郊
12 Smith Street Surry Hills NSW 薩里山
15 Sunny Road North Bondi NSW 北邦迪
新南威爾士州邦迪瓊斯街 34 號 邦迪

考慮以下方法

SELECT p.address, 
  STRING_AGG(s.suburb ORDER BY LENGTH(s.suburb) DESC LIMIT 1) suburb
FROM `property` p
JOIN `suburbs` s
ON INITCAP(p.address) LIKE CONCAT('%', INITCAP(s.suburb),' ', INITCAP(s.state), '%')
GROUP BY p.address             

如果應用於您問題中的示例數據 - output 是

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM