2025年8月12日 BigQueryのパイプ構文を使ってみよう! BigQuery Google Cloud 検索する Popular tags 生成AI(Generative AI) Vertex AI Search Looker Studio BigQuery AlloyDB Google Workspace 事例紹介 Cloud SQL Category Google Cloud Author ten SHARE 目次 BigQueryのパイプ構文とは パイプ構文の3つのメリット まとめ 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導入・活用支援に関するご相談はこちら 関連コンテンツ ビジネス成長の新たな鍵!BigQueryでデータ活用の一歩を踏み出そう by tenon 2024年3月6日 頂きましたご意見につきましては、今後のより良い商品開発・サービス改善に活かしていきたいと考えております。 よく分かった 気になる おもしろい イマイチ Author ten 株式会社システムサポート 大阪事業本部ソリューションデザイン事業部所属。 Google Cloud 認定 14資格、AWS 認定 14資格。最近はAIエージェント×Lookerの可能性を探っています。 BigQuery Google Cloud 2025年8月12日 BigQueryのパイプ構文を使ってみよう! Category Google Cloud 前の記事を読む Lookerのネイティブ派生テーブルを活用する Recommendation オススメ記事 2023年9月5日 Google Cloud 【Google Cloud】Looker Studio × Looker Studio Pro × Looker を徹底比較!機能・選び方を解説 2023年8月24日 Google Cloud 【Google Cloud】Migrate for Anthos and GKEでVMを移行してみた(1:概要編) 2022年10月10日 Google Cloud 【Google Cloud】AlloyDB と Cloud SQL を徹底比較してみた!!(第1回:AlloyDB の概要、性能検証編) BigQuery ML ワークショップ開催のお知らせ 生成AI導入支援パッケージ Discovery AI導入支援パッケージ Google Cloud ホワイトペーパー 新着記事 2025年8月12日 Google Cloud BigQueryのパイプ構文を使ってみよう! 2025年8月12日 Google Cloud Lookerのネイティブ派生テーブルを活用する 2025年8月8日 Google Cloud Google Cloud Next Tokyo 25 参加レポート【全体ダイジェスト編】 HOME Google Cloud BigQueryのパイプ構文を使ってみよう!