BigQueryで複雑な集計をしているとクエリが500行を超えることもあります。
その行数のクエリを1つのSELECT文で書こうとした結果、以下のような悩みを抱えることはありませんか?
- FROM句の中にJOINしたクエリが並んでいて途中で頭が混乱する…
- 翌日見返すと全く読み解けない…
これらの悩みはWITHで解決できます!
こちらの記事ではWITH句の基本的な使い方について解説します。
WITH句を使うメリット
間違わずに集計できる
SQLでクエリを書く際に集計結果の正確性を気にするケースは多いのではないでしょうか?
- このクエリで集計したレポートは100人が見るBIツールで使用される。
- 経営者に見せるデータを集計する。
など、集計結果に重い責任が乗るケースはあるかと思います。
WITH句を使うことで、個別のSELECT文が理解しやすくなり、結果の検証もしやすくなるため、クエリの正確性が上がります。実際、私の周りでも集計を間違いやすいBigQuery初心者はWITH句を使っていないケースがほとんどです。
レビューが簡単にできる
他のメンバーが書いたクエリをレビューする際に、WITH句を使っていない場合、読み解くのがかなり困難です。
個別のクエリは保守前提で書かれないことが多く、積極的にコメントを記載する文化の組織は少ない印象を持っていますが、コメントが記載されていなかったとしてもWITH句があるだけでかなり読み解く難易度は下がります。
WITH句の使い方
WITH句を使わないクエリ
SELECT
b.name,
SUM(a.sales) AS sales
FROM
(
SELECT
id,
sales
FROM
sales_data
WHERE
date >= DATE("2021-01-01")
) a
JOIN
(
SELECT
id,
name
FROM
master_data
WHERE
name = "hoge"
) b
ON
a.id = b.id
GROUP BY
b.name
WITH句を使うクエリ
WITH
current_sales_data AS (
SELECT
id,
sales
FROM
sales_data
WHERE
date >= DATE("2021-01-01")
),
hoge_master_data AS (
SELECT
id,
name
FROM
master_data
WHERE
name = "hoge"
)
SELECT
b.name,
SUM(a.sales) AS sales
FROM
current_sales_data a
JOIN
hoge_master_data b
ON
a.id = b.id
GROUP BY
b.name
使い方は簡単で、
- 「WITH」をクエリの先頭に記載する
- 「サブクエリ名 AS (クエリ)」を記載する
- サブクエリをテーブルのように扱って出力するクエリを記載する
になります。サブクエリを複数連ねるときはカンマで区切って並べることが可能です。例では2つのみ並べていますが3つ以上並べることも可能です。
今回の例はシンプルなクエリでしたが、実業務ではクエリが複雑で行数も増えるため、WITH句を使ったほうが明らかに読みやすくなります。
よくあるWITH句でのエラー
途中のサブクエリでカンマが抜ける
WITH
current_sales_data AS (
SELECT
id,
sales
FROM
sales_data
WHERE
date >= DATE("2021-01-01")
)
hoge_master_data AS (
SELECT
id,
name
FROM
master_data
WHERE
name = "hoge"
)
SELECT
b.name,
SUM(a.sales) AS sales
FROM
current_sales_data a
JOIN
hoge_master_data b
ON
a.id = b.id
GROUP BY
b.name
このクエリを実行すると以下のエラーメッセージが表示されます。
Syntax error: Expected "(" or "," or keyword SELECT but got identifier "hoge_master_data" at [25:1]
1つ目のサブクエリのカッコの後にカンマが抜けているのが原因なので、カンマを付けることでエラーが解消されます。
最後のサブクエリにカンマが付いている
WITH
current_sales_data AS (
SELECT
id,
sales
FROM
sales_data
WHERE
date >= DATE("2021-01-01")
),
hoge_master_data AS (
SELECT
id,
name
FROM
master_data
WHERE
name = "hoge"
),
SELECT
b.name,
SUM(a.sales) AS sales
FROM
current_sales_data a
JOIN
hoge_master_data b
ON
a.id = b.id
GROUP BY
b.name
このクエリを実行すると以下のエラーメッセージが表示されます。
Syntax error: Trailing comma after the WITH clause before the SELECT clause is not allowed at [35:1]
最後のサブクエリのカッコの後のカンマを削除することでエラーが解消されます。
まとめ
こちらの記事では、
- WITH句を使うメリット
- WITH句の使い方
について解説しました。
初心者はWITH句を敬遠して1つのクエリで記載してしまいがちなケースは多いと思いますが、WITH句は簡単に使いこなせるので是非日々の集計で活用してみてください!
コメント