Content
こんにちは、tenです。
今回はBigQueryのパイプ構文について紹介したいと思います。
先日のGoogle Cloud Next Tokyo '25でも少し触れられていましたので、記憶に新しい方もいらっしゃるのではないでしょうか。
 

なお、Google Cloud Next Tokyo '25については下記の参加レポートもぜひご覧ください。

Google Cloud Next Tokyo ’25 参加レポートDAY1
Google Cloud Next Tokyo ’25 参加レポートDAY2

BigQueryのパイプ構文とは

パイプ構文の紹介に入る前に、皆さんはSQLを扱う中で、

  • 「サブクエリが複雑で、何をしているか理解するのに時間がかかる」
  • 「集計処理のデバッグをしたいけど、どこから手を付けたらよいかわからない」

といったご経験はありませんか?
 
2025年4月に一般提供されたBigQueryのパイプ構文は、まさにこのような悩みを解決するための、SQLの新しい書き方です。
 

BigQueryのパイプ構文は、クエリを「データ処理の流れ」として表現する記法です。
Unix/Linuxのパイプラインのように、一つの処理結果を次の処理に渡していく形でクエリを記述します。
 

従来のSQL構文

SELECT item, AVG(total_sales) as avg_sales
FROM (
SELECT item, SUM(sales) as total_sales
FROM sales_transactions
WHERE sales > 0
GROUP BY item, date
)
GROUP BY item
ORDER BY avg_sales DESC;

パイプ構文

FROM sales_transactions
|> WHERE sales > 0
|> AGGREGATE SUM(sales) AS total_sales GROUP BY item, date
|> AGGREGATE AVG(total_sales) AS avg_sales GROUP BY item
|> ORDER BY avg_sales DESC;

パイプ構文の3つのメリット

メリット1: 思考の流れに沿った記述

従来のSQL構文では「SELECT → FROM → WHERE → GROUP BY → ORDER BY」といった固定された順序で記述する必要がありました。
順番を間違えてクエリが実行できない、という場面に出くわした方もそう少なくないはず。
なぜなら、この順序が私たちの思考プロセスと必ずしも一致していないからです。

パイプ構文では、「どのデータを使うかを指定して(FROM) → 特定の条件に絞り込んで(WHERE) → 集計する(AGGREGATE)」という、自然な思考の流れそのままにクエリを書くことができます。
 

メリット2: 段階的なデバッグが簡単

パイプ構文のパイプ演算子は、「有効なクエリの末尾に」追加できます。
裏を返すと、パイプ構文は途中で区切っても有効なクエリとして機能します。
そのため、処理途中の任意の位置で、段階的に結果を確認することができます。

FROM sales_transactions
|> WHERE state = 'WA' -- ここまで実行して中間結果を確認
|> AGGREGATE SUM(cost) AS total GROUP BY customer_id
|> WHERE total > 100 -- さらにここまで実行して確認
|> ORDER BY total DESC; -- 問題なければ最後に結果を並び替え

 

メリット3: クエリを再利用しやすい

メリット2で挙げたように、パイプ構文では途中で区切っても有効なクエリとして機能するため、
あるクエリを起点として、さまざまな分析パターンに派生することができます。

 

ベースラインクエリ

FROM sales_transactions
|> WHERE transaction_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
|> WHERE status = 'completed'
|> EXTEND
DATE_TRUNC(transaction_date, MONTH) AS month,
EXTRACT(DAYOFWEEK FROM transaction_date) AS day_of_week,
CASE
WHEN amount >= 10000 THEN 'high'
WHEN amount >= 5000 THEN 'medium'
ELSE 'low'
END AS price_tier
|> AGGREGATE
SUM(amount) AS total_sales,
COUNT(DISTINCT customer_id) AS unique_customers,
COUNT(*) AS transaction_count,
AVG(amount) AS avg_transaction_value
GROUP BY month, category, region, price_tier

派生したクエリ1

FROM sales_transactions
|> WHERE transaction_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
|> WHERE status = 'completed'
|> EXTEND
DATE_TRUNC(transaction_date, MONTH) AS month,
EXTRACT(DAYOFWEEK FROM transaction_date) AS day_of_week,
CASE
WHEN amount >= 10000 THEN 'high'
WHEN amount >= 5000 THEN 'medium'
ELSE 'low'
END AS price_tier
|> AGGREGATE
SUM(amount) AS total_sales,
COUNT(DISTINCT customer_id) AS unique_customers,
COUNT(*) AS transaction_count,
AVG(amount) AS avg_transaction_value
GROUP BY month, category, region, price_tier
-- ↑ ここまでベースラインクエリと同じ ↑
-- ↓ キャンペーン分析を追加 ↓
|> JOIN campaign_master USING(month, region)
|> EXTEND total_sales / campaign_cost AS roi
|> WHERE campaign_name IS NOT NULL
|> AGGREGATE
SUM(total_sales) AS campaign_sales,
AVG(roi) AS avg_roi
GROUP BY campaign_name, category
|> ORDER BY avg_roi DESC;

派生したクエリ2

FROM sales_transactions
|> WHERE transaction_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
|> WHERE status = 'completed'
|> EXTEND
DATE_TRUNC(transaction_date, MONTH) AS month,
EXTRACT(DAYOFWEEK FROM transaction_date) AS day_of_week,
CASE
WHEN amount >= 10000 THEN 'high'
WHEN amount >= 5000 THEN 'medium'
ELSE 'low'
END AS price_tier
|> AGGREGATE
SUM(amount) AS total_sales,
COUNT(DISTINCT customer_id) AS unique_customers,
COUNT(*) AS transaction_count,
AVG(amount) AS avg_transaction_value
GROUP BY month, category, region, price_tier
-- ↑ ここまでベースラインクエリと同じ ↑
-- ↓ カテゴリ分析を追加 ↓
|> AGGREGATE SUM(total_sales) AS monthly_sales
GROUP BY month, category
|> EXTEND LAG(monthly_sales) OVER (
PARTITION BY category ORDER BY month
) AS prev_month_sales
|> EXTEND (monthly_sales - prev_month_sales) / prev_month_sales * 100 AS growth_rate
|> WHERE growth_rate IS NOT NULL
|> SELECT category, month, monthly_sales, growth_rate
|> ORDER BY category, month;

まとめ

BigQueryのパイプ構文は、SQLの表現力はそのままに、より直感的でメンテナンス性の高いクエリの記述を可能にします。
特に以下のようなユースケースで威力を発揮することでしょう
 

  • 探索的データ分析: 段階的にクエリを構築・検証できる
  • チーム開発: 可読性が高く、他のメンバーにクエリを共有しやすい
  • 複雑なクエリ記述: 複雑なネストやCTEを避けてシンプルに記述できる

 

まずは簡単なクエリから、ぜひパイプ構文の良さを体験してみてください!
 

参考URL:
https://cloud.google.com/bigquery/docs/pipe-syntax-guide?hl=ja
https://cloud.google.com/bigquery/docs/analyze-data-pipe-syntax?hl=ja
 
 

システムサポートでは、Google Cloudの導入や活用を支援しております。
BigQueryを使ってみたい・もっと詳しく知りたいという方は、お気軽にご相談ください!

Google Cloud導入・活用支援に関するご相談はこちら

2025年8月12日 BigQueryのパイプ構文を使ってみよう!

Category Google Cloud

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら