Google Cloudでプロジェクトを1つ用意する:BigQuery APIを有効化し、GA4のサービスアカウント(firebase-measurement@system.gserviceaccount.com)にBigQuery管理者権限を付与しておきます。既存プロジェクトを流用してもかまいませんが、費用の見通しを立てやすくするために「解析データ専用のプロジェクト」を1つ切ることを推奨します
-- 例: 特定のCVイベント数を日別で集計するSELECT event_date, COUNT(*) AS cv_countFROM `myproject.analytics_123456789.events_*`WHERE _TABLE_SUFFIX BETWEEN '20260701' AND '20260731' AND event_name = 'purchase'GROUP BY event_dateORDER BY event_date;
SELECT (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_url, COUNT(*) AS pv, COUNT(DISTINCT user_pseudo_id) AS uuFROM `myproject.analytics_123456789.events_*`WHERE _TABLE_SUFFIX BETWEEN '20260701' AND '20260731' AND event_name = 'page_view'GROUP BY page_urlORDER BY pv DESCLIMIT 100;
2. 流入元別のCV数とCVR
WITH sessions AS ( SELECT user_pseudo_id, (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS session_id, traffic_source.source AS source, traffic_source.medium AS medium, event_name FROM `myproject.analytics_123456789.events_*` WHERE _TABLE_SUFFIX BETWEEN '20260701' AND '20260731')SELECT source, medium, COUNT(DISTINCT CONCAT(user_pseudo_id, CAST(session_id AS STRING))) AS sessions, COUNTIF(event_name = 'purchase') AS cv, SAFE_DIVIDE(COUNTIF(event_name = 'purchase'), COUNT(DISTINCT CONCAT(user_pseudo_id, CAST(session_id AS STRING)))) AS cvrFROM sessionsGROUP BY source, mediumORDER BY cv DESC;
3. ファネル分析(ページA → ページB → 購入)
WITH events AS ( SELECT user_pseudo_id, event_timestamp, event_name, (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page FROM `myproject.analytics_123456789.events_*` WHERE _TABLE_SUFFIX BETWEEN '20260701' AND '20260731')SELECT COUNTIF(page LIKE '%/product/%') AS step1_product_view, COUNTIF(page LIKE '%/cart%') AS step2_cart, COUNTIF(event_name = 'purchase') AS step3_purchaseFROM events;
4. 商品別の売上ランキング
SELECT item.item_name, SUM(item.quantity) AS qty, SUM(item.item_revenue) AS revenueFROM `myproject.analytics_123456789.events_*`, UNNEST(items) AS itemWHERE _TABLE_SUFFIX BETWEEN '20260701' AND '20260731' AND event_name = 'purchase'GROUP BY item.item_nameORDER BY revenue DESCLIMIT 30;
WHERE _TABLE_SUFFIX BETWEEN ... を書き忘れると、events_* は全期間のテーブルをスキャンします。1本のクエリで数千円〜の請求が発生するケースも珍しくありません。BigQuery側の予算アラートとクエリごとのスキャン量上限(--maximum_bytes_billed)を先に設定しておくのが安全です。
Amazon RedshiftからBigQueryへの移行判断・費用・工程を、稟議とベンダー選定にそのまま使える形で整理します。BigQuery Data Transfer ServiceでのRedshift移行、SUPER型やDISTKEY/SORTKEYの扱い、AWS→GCPのエグレス費用、10TB規模で初期1,000万〜2,000万円・3〜4ヶ月という目安まで解説します。