GA4 日次新規ユーザー数集計クエリの解剖

109 Views

March 28, 26

スライド概要

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

GA4 日次新規ユーザー数 集計クエリの解剖 BigQueryにおけるSQLアーキテクチャと処理プロセスの構造的理解

2.
[beta]
Block 1: 期間の設定
(一時関数の定義)
Zen Kaku Gothic New. 一時関数
を定義し、指定したデータの定義を
つくること、期間の限定を言う可能で
す。
CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20260301');
CREATE TEMP FUNCTION date_to() RETURNS STRING AS ('20260331');
WITH NewUU_Daily AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS ymd,
COUNT(DISTINCT user_pseudo_id) AS _new_uu
FROM
<project>.<dataset>.events_*
WHERE
event_name = 'first_visit'
AND _TABLE_SUFFIX BETWEEN date_from() AND date_to()
GROUP BY ymd
ORDER BY ymd
)
SELECT * FROM NewUU_Daily
Block 2: データの抽出と
加工 (CTEメイン処理)
Zen Kaku Gothic New. Common
Table Expression (CTE)
'NewUU_Daily'を作成し、データ
の抽出加工に関したデータを選択。
またにしたデータを選択し、日時切
バースを掘り、日数の初ユーザーで
抽出されたデータをする。
'first_visit'イベントを抽出できる
るなど、演算したデータを混して
AND _TABLE_SUFFIX BETWEEN
を徹底する。
Block 3: 集計と並べ替え
(構造化)
Zen Kaku Gothic New. 日数と
毎日の新しいユーザーされた日時
(ymd)を集計した... (UU)を登進
化した。最後、結果の結果により、
日見を並替えする。
Block 4: 最終出力
(実行)
Zen Kaku Gothic Newでクエリ
フを実行すると、定義的なCTE分の
毎日の新しいユーザーデータを実行
する。
3.
[beta]
期間の設定:メンテナンス性の担保
CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20260301');
CREATE TEMP FUNCTION date_to() RETURNS STRING AS ('20260331');
WITH NewUU_Daily AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS ymd,
COUNT(DISTINCT user_pseudo_id) AS _new_uu
FROM
<project>.<dataset>.events_*
WHERE
event_name = 'first_visit'
AND _TABLE_SUFFIX BETWEEN date_from() AND date_to()
GROUP BY ymd
ORDER BY ymd
)
SELECT * FROM NewUU_Daily
Block 3: 集計と並べ替え
(構造化)
Zen Kaku Gothic New. 日数と
毎日の新しいユーザーされた日時
(ymd)を集計した... (UU)を登進
化した。最後、結果の結果により、
日見を並替えする。
Control Panel
date_from()
20260301
date_to()
20260331
・開始日と終了日を一時的
な関数として先頭で定義。
・クエリ深層部の日付を直
接書き換えるリスクを排
除。
価値
運用時の変更箇所を先頭の
2行に集約し、保守性を劇
的に向上。
4.

スキャン範囲の最適化:コスト削減と高速化 CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20260301'); CREATE TEMP FUNCTION date_to() RETURNS STRING AS ('20260331'); WITH NewUU_Daily AS ( SELECT PARSE_DATE('%Y%m%d', event_date) AS ymd, COUNT(DISTINCT user_pseudo_id) AS _new_uu FROM <project>.<dataset>.events_* WHERE event_name = 'first_visit' AND _TABLE_SUFFIX BETWEEN date_from() AND date_to() GROUP BY ymd ORDER BY ymd ) SELECT * FROM NewUU_Daily 0228 0301 0302 ... 0331 0401 <project>.<dataset>.events_* ・GA4データは日別のテーブ ル(events_YYYYMMDD)と して保存される。 ・_TABLE_SUFFIXを利用し、 指定期間内のテーブルの みをスキャン対象に制限。 価値 不要なデータの読み込みを 回避し、クエリ料金の節約と 処理の高速化を同時に実現。

5.

Minimap 30% CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20260301'); CREATE TEMP FUNCTION date_to() RETURNS STRING AS ('20260331'); WITH NewUU_Daily AS ( SELECT PARSE_DATE('%Y%m%d', event_date) AS ymd, COUNT(DISTINCT user_pseudo_id) AS _new_uu FROM <project>.<dataset>.events_* WHERE event_name = 'first_visit' AND _TABLE_SUFFIX BETWEEN date_from() AND date_to() GROUP BY ymd ORDER BY ymd ) SELECT * FROM NewUU_Daily Main Stage 70% ターゲット抽出:新規アクセスの特定 page_view scroll page_view scroll first_visit page_view New Users ・GA4の仕様上、ユーザー 初回訪問時にのみ first_visit イベントが 記録される。 ・無数のイベント群から この特定イベントのみ を抽出。 価値 行動データから「新規ユ ーザー」という抽象的な 概念を正確に分離・抽出。

6.

型変換:分析用フォーマットへの成形 WITH NewUU_Daily AS ( SELECT PARSE_DATE('%Y%m%d', event_date) AS ymd, COUNT(DISTINCT user_pseudo_id) AS _new_uu FROM <project>.<dataset>.events_* WHERE event_name = 'first_visit' AND _TABLE_SUFFIX BETWEEN date_from() AND date_to() GROUP BY ymd ORDER BY ymd ) SELECT * FROM NewUU_Daily STRING型 (文字列) '20260301' PARSE_DATE DATE型 (ymd) 2026-03-01 ・event_date は初期状態では単なる文 字列。 ・PARSE_DATE 関数を用いて、システムが 認識できる日付型へと変換。 価値 後工程でのBIツール連携、 時系列グラフ化、日付ベース の演算を可能にする。

7.
[beta]
Minimap 30%
CREATE TEMP FUNCTION date_from()
RETURNS STRING AS ('20260301');
CREATE TEMP FUNCTION date_to()
RETURNS STRING AS ('20260331');
WITH NewUU_Daily AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS ymd,
COUNT(DISTINCT user_pseudo_id)
AS _new_uu
FROM
<project>.<dataset>.events_*
WHERE
event_name = 'first_visit'
AND _TABLE_SUFFIX BETWEEN
date_from() AND date_to()
GROUP BY ymd
ORDER BY ymd
)
SELECT * FROM NewUU_Daily
Main Stage 70%
重複排除:正確なデバイス(ユーザー)数の算出
[ ID: A9X ]
[ ID: B2Y ]
[ ID: A9X ]
[ ID: C4Z ]
[ ID: A9X ]
DISTINCT
[ A9X ]
[ B2Y ]
[ C4Z ]
3
・user_pseudo_id はブラウザ単位で付
与される匿名ID。
・同日に同一ユーザーが複数回アクセス
するケースを想定。
価値
単純なカウントではなくDISTINCT
を用いることで、イベント数では
なく「何デバイス」アクセスした
かの正確な実数を保証。
8.

Minimap 30% WITH NewUU_Daily AS ( SELECT PARSE_DATE('%Y%m%d', event_date) AS ymd, COUNT(DISTINCT user_pseudo_id) AS _new_uu FROM <project>.<dataset>.events_* WHERE event_name = 'first_visit' AND _TABLE_SUFFIX BETWEEN date_from() AND date_to() GROUP BY ymd ORDER BY ymd ) SELECT * FROM NewUU_Daily Main Stage 70% 集計と整列:データのタイムライン化 GROUP BY & ORDER BY Timeline (ymd) ・GROUP BY: 抽出したデータを日付 (ymd)ごとに集約。 ・ORDER BY: 集約されたデータを古い 日付から順に並べ替え。 価値 データベースの無秩序なレコード の集合を、人間が解釈可能な 「時系列のトレンドデータ」へと 昇華。

9.
[beta]
Left Minimap
CREATE TEMP FUNCTION date_from()
RETURNS STRING AS ('20260301');
CREATE TEMP FUNCTION date_to()
RETURNS STRING AS ('20260331');
WITH NewUU_Daily AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS ymd,
COUNT(DISTINCT user_pseudo_id) AS _new_uu
FROM
<project>.<dataset>.events_*
WHERE
event_name = 'first_visit'
AND _TABLE_SUFFIX BETWEEN
date_from() AND date_to()
GROUP BY ymd
ORDER BY ymd
)
SELECT * FROM NewUU_Daily
Main Stage
メイン処理の実行:最終結果の呼び出し
CTE: NewUU_Daily
SELECT *
・これまでWITH句内で構築してきた
仮想テーブル NewUU_Daily を呼び出
す。
価値
複雑な処理ロジック(CTE内)と、
最終的な出力命令(SELECT文)を
分離することで、コード全体の可読
性を高く保つ。
10.

Output: The Polished Data 最終的に生成されるデータセット。ノイズが排除され、コストが最適化された状態から抽出された、 正確な「日次新規ユーザー数」の推移。即座にBIダッシュボードやレポーティングに接続可能。 ymd _new_uu 2026-03-01 1,200 2026-03-02 1,150 2026-03-03 1,310 ...

11.

SQL Function (ツール) Mechanism (処理機構) Business Value (アーキテクチャの目的) TEMP FUNCTION 変数による一元管理 保守性・運用コストの低減 _TABLE_SUFFIX スキャン範囲の限定 クエリ料金節約・高速処理 COUNT(DISTINCT) IDの重複排除 精緻なユーザー実数の把握 PARSE_DATE 文字列から日付型への変換 ダッシュボード連携の容易さ 優れたSQLは単にデータを出すだけでなく、コスト、精度、保守性が構造的に設計されている。