Bigquery: 利用 With把巢狀結構function化

許博淳
數據共筆
Published in
Apr 20, 2022

隨著 Query變複雜,就會需要多層的結構來產生結果,以下示範可能的情境,以及如何用 With來優化

1. 巢狀 Query

傳統上如果需要進行複雜的 Query,會寫成Sub-Query的形式,例如下列

SELECT
...
FROM(
SELECT
...
FROM
A
)

隨著層數的增加,理解也會困難,要一層一層記住運算結果也會非常困難,因此可以使用別名方便記憶

SELECT
...
FROM(
SELECT
...
FROM
A
) AS number_of_users
LEFT JOIN(
SELECT
...
FROM
B
) AS number_of_videos
ON
number_of_users.user_id = number_of_videos.user_id

可是看起來就是很討厭阿!一大沱東西

2. 為何要使用 With

不然我就掰不下去了(誤)

使用 With可以把每一個 sub-query用類似物件的方式包裝起來,舉個例子

WITH number_of_users AS (
SELECT
...
FROM
A
),
number_of_videos AS (
SELECT
...
FROM
B
)
SELECT
...
FROM
number_of_users
LEFT JOIN
number_of_videos
ON
number_of_users.user_id = number_of_videos.user_id

在最下面的 Query我們只要理解 number_of_usersnumber_of_videos 是用 user_id Join起來,至於 number_of_usersnumber_of_videos 是怎麼運算出來的,I don’t fucking care,想知道的話再往上找即可。

3. 使用 With前後差異

  • 清楚區分前面的區塊是 sub-query,最後是主 Query
  • 直接進入主 Query,不用先了解細節
  • 快速找到各個別名的實際內容
巢狀 Query與改寫成 With後的比較

--

--