oracle中的with as子查詢用法

在開發標籤或者特徵時,需要以基本對象爲基礎,做許多關聯、計算或統計。

如果開發的特徵數目少,涉及到的表也比較少,可能還可以寫一大段關聯一氣呵成。然而,絕大多數情況下,隨着標籤涉及到基礎數據表的膨脹,數據在關聯中也不斷膨脹,非常容易出問題。那麼如何解決這個問題呢?

在oracle中,with as 的子查詢就非常好用。

標籤開發的基本思路是這樣的:

  1. 確定標籤領域:比如此次標籤或特徵是打在user上還是commodity上
  2. 確定主鍵:如果是對user開發特徵,就要確保接下來所有的特徵值能夠關聯到user上,比如都以user_id作爲主鍵
  3. 確定主表:一般來說,如果是要對commodity開發標籤,則以commodity基礎信息表爲主表,確定了主表也確定了數據記錄數
  4. 開發多個子查詢:在oracle開發標籤的話,就可以用with as實現子查詢,所有子查詢結果均滿足與標籤領域同一主鍵
  5. 合併子查詢結果:通過每個子查詢的主鍵進行表關聯,將各個標籤結果合併起來
with 
tmp_subdealers as (
    select dealer_id,count(subdealer_id) as dlr_subdealers_cnt 
    from dms_biz.dt_bb_subdealers
    where sdf_status ='520005'
    group by dealer_id      --狀態爲正常
),     

tmp_service_stations as(
    select company_id, count(dealer_id) as dlr_stations_cnt
    from dms_biz.dt_bb_service_stations
    where biz_status = '100005' --狀態正常
    group by company_id
)

with as進行多子表查詢時,別名用法如上所示,每個子查詢的本質是一張視圖,數據只暫時存儲在內存中,不會落表存儲到數據庫中。

如代碼中所示,兩個子查詢生成別名爲tmp_subdealers和tmp_service_stations的臨時表,現在看來,這兩個臨時表裏,分別只計算了一個指標值。在接下來就可以向正常表一樣使用其中的標籤值了。

left join tmp_subdealers on d1.dealer_id = tmp_subdealers.dealer_id
left join tmp_service_stations on d1.company_id = tmp_service_stations.company_id
left join tmp_dlr_cstm on d1.dealer_id = tmp_dlr_cstm.dealer_id

這樣每個指標,或每幾個相關的指標可以在一個子查詢中實現,coding思路清晰,閱讀和檢查起來都非常方便。

掃描下方二維碼,關注微信公衆號“數據分析師手記”,一起進步!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章