BigQueryでセッション・エンゲージメントを分析するクエリ集

本ページのSQLを利用する前に、利用前の確認事項を必ずご確認ください。自社のプロジェクトIDとプロパティIDをfrom句に設定してからクエリを実行してください。

このページでは、BigQueryを使ってGA4のセッション・エンゲージメントデータを分析するクエリを紹介します。エンゲージメントセッション数、滞在時間、流入元別セッション、アクティブユーザー、ページ別訪問回数、ランディングページ、離脱・直帰分析など、セッション品質の評価に使えるSQL集です。

21:セッションごとのエンゲージを確認

select
    user_pseudo_id, --ユーザーのCookieIDを取得
    (select value.int_value from unnest(event_params) where key = 'ga_session_id') as session_id, --ユーザーのセッションIDを取得
    max((select value.string_value from unnest(event_params) where key = 'session_engaged')) as session_engaged --セッションエンゲージのパラメータを取得(1か0が含まれている)
from
    `ha-ga4.analytics_227084301.events_*`    -- データの選択範囲。ここでは全期間とし、whereの部分で日付を指定する
 
where
    _table_suffix between '20220201' and '20220205'  -- 日付の指定
 
group by 
    user_pseudo_id, --ユーザーのCookieIDでグルーピング
    session_id --セッションIDでグルーピング

実行結果

22:エンゲージしたセッション数を取得

with predata as ( --14行目までのselect文に名称をつける。ここではpredata。「(」を忘れないように
select
    user_pseudo_id, --ユーザーのCookieIDを取得
    (select value.int_value from unnest(event_params) where key = 'ga_session_id') as session_id, --ユーザーのセッションIDを取得
    max((select value.string_value from unnest(event_params) where key = 'session_engaged')) as session_engaged --セッションエンゲージのパラメータを取得(1か0が含まれている)
from
    `ha-ga4.analytics_227084301.events_*`    -- データの選択範囲。ここでは全期間とし、whereの部分で日付を指定する

where
    _table_suffix between '20220201' and '20220205'  -- 日付の指定
group by 
    user_pseudo_id, --ユーザーのCookieIDでグルーピング
    session_id) --セッションIDでグルーピング。クエリの最後でpredataを閉じるため「)」を忘れないように
 
select 
    count(distinct concat(user_pseudo_id,"-",session_id)) as sessions, --CookieIDとセッションIDをつなげユニーク数をカウントし、厳密なセッション数を取得
    count(distinct case when session_engaged = '1' then concat(user_pseudo_id,"-",session_id) else null end) as engaged_sessions --session_engagedの値が1の時に、CookieIDとセッションIDをつなげたユニーク数をカウントし、エンゲージメントセッション数を算出。1以外の場合はnullに変換
from 
    predata --上記の2つのcountをpredataのクエリ結果から取得

実行結果

23:セッションごとの滞在時間を取得

with prepdata as ( -- select文に名称をつける
select
    user_pseudo_id,--ユーザーのCookieIDを取得
    (select value.int_value from unnest(event_params) where key = 'ga_session_id') as session_id,--ユーザーのセッションIDを取得
    event_timestamp --イベントのタイムスタンプを取得
from
    `ha-ga4.analytics_227084301.events_*`    -- データの選択範囲。ここでは全期間とし、whereの部分で日付を指定する
where
    _table_suffix between '20220201' and '20220207') -- データの取得期間を指定
 
select
    user_pseudo_id,--ユーザーのCookieIDを取得
    session_id,--ユーザーのセッションIDを取得
    timestamp_seconds(session_id) as session_start_time,--セッション開始時ののタイムスタンプを取得
    (max(event_timestamp)-min(event_timestamp))/1000000 as session_length_seconds --セッションごとの最大と最小のタイムスタンプを引き算し、100万で割ることで秒数に変換
from
    prepdata --perpdataから取得
group by 
    user_pseudo_id,--ユーザーのCookieIDでグルーピング
    session_id--ユーザーのセッションIDでグルーピング

実行結果

24:流入元ごとのセッション数を取得

with predata as ( --select文に名称をつける。ここではpredata。「(」を忘れないように
select
    user_pseudo_id, --ユーザーのCookieIDを取得
    (select value.int_value from unnest(event_params) where key = 'ga_session_id') as session_id, --ユーザーのセッションIDを取得
    max((select value.string_value from unnest(event_params) where key = 'session_engaged')) as session_engaged, --セッションエンゲージのパラメータ取得
    max((select value.string_value from unnest(event_params) where key = 'medium')) as medium, --イベントパラメータからメディアを取得。session_startのイベントには流入元は記録されていないため、該当セッションID内に含まれているメディアを取得してくる
    max((select value.string_value from unnest(event_params) where key = 'source')) as source --イベントパラメータから参照元を取得。session_startのイベントには流入元は記録されていないため、該当セッションID内に含まれているメディアを取得してくる
from
    `ha-ga4.analytics_227084301.events_*`    -- データの選択範囲。ここでは全期間とし、whereの部分で日付を指定する
where
    _table_suffix between '20220201' and '20220205'  -- 日付の指定
group by 
    user_pseudo_id, --ユーザーのCookieIDでグルーピング
    session_id) --セッションIDでグルーピング。クエリの最後でpredataを閉じるため「)」を忘れないように
 
select 
    concat(ifnull(source,'(direct)'),' / ',ifnull(medium,'(none)')) as session_source_medium, --セッションとメディアを「/」でつなげる。参照元に値が入っていない場合は参照元を(direct)に変換、メディアに値が入っていない場合はメディアを(none)に変換
    count(distinct concat(user_pseudo_id,"-",session_id)) as sessions, --CookieIDとセッションIDをつなげユニーク数をカウントし、厳密なセッション数を取得
    count(distinct case when session_engaged = '1' then concat(user_pseudo_id,"-",session_id) else null end) as engaged_sessions --session_engagedの値が1の時に、CookieIDとセッションIDをつなげたユニーク数をカウントし、エンゲージメントセッション数を算出。1以外の場合はnullに変換
 
from 
    predata --上記の2つのcountをpredataのクエリ結果から取得
group by
    session_source_medium  --参照元メディアでグルーピング
order by
    sessions desc  --セッション数、降順で並び替え

実行結果

25:エンゲージしたユーザー数を取得

with predata as ( --14行目までのselect文に名称をつける。ここではpredata。「(」を忘れないように
select
    user_pseudo_id, --ユーザーのCookieIDを取得
    sum((select value.int_value from unnest(event_params) where key = 'engagement_time_msec')) as engagement_time_msec --ユーザーのエンゲージメント時間(画面がユーザーの前面に出ていた時間(ミリ秒)を取得。
    
from
    `ha-ga4.analytics_227084301.events_*`    -- データの選択範囲。ここでは全期間とし、whereの部分で日付を指定する
 
where
    _table_suffix between '20220201' and '20220205'  -- 日付の指定
 
group by 
    user_pseudo_id) --ユーザーのCookieIDでグルーピング。クエリの最後でpredataを閉じるため「)」を忘れないように
 
select 
    count(distinct user_pseudo_id) as users, --ユーザーのCookieIDユニーク数をユーザー数として取得
    count(distinct case when engagement_time_msec > 0 then user_pseudo_id else null end) as active_users  --エンゲージメント時間が0ミリ秒より大きい場合はアクティブユーザーとする。0の場合はnullとし、アクティブユーザーのユーザーCookieiDのユニーク数を取得
    
from 
    predata --上記の2つのcountをpredataのクエリ結果から取得

実行結果

26:ページ別の訪問回数を取得

with predata as (
select
    user_pseudo_id,  --ユーザーのCookieIDを取得
    (select value.int_value from unnest(event_params) where event_name = 'page_view' and key = 'ga_session_id') as session_id,--ユーザーのセッションIDを取得
    (select value.string_value from unnest(event_params) where event_name = 'page_view' and key = 'page_title') as page_title,--ページタイトルを取得
    (select value.string_value from unnest(event_params) where event_name = 'page_view' and key = 'page_location') as page--ページURLを取得
from
    `ha-ga4.analytics_227084301.events_*`    -- データの選択範囲。ここでは全期間とし、whereの部分で日付を指定する
where
    _table_suffix between '20220201' and '20220205')  -- 日付の指定
 
select 
    page_title, --ページタイトルを取得
    page, --ページURLを取得
    count(*) as total_pageviews, --行数をページビューとして取得
    count(distinct concat(user_pseudo_id,"-",session_id)) as unique_pageviews --CookieIDとセッションIDをつなげユニーク数をカウントし、ページ別訪問回数を取得
 
from 
    predata--上記42つのデータをpredataのクエリ結果から取得
group by 
    page_title, --ページタイトルでグルーピング
    page --ページURLでグルーピング
order by
    unique_pageviews desc --ページ別訪問回数の降順で並び替え

実行結果

27:ランディングページごとの流入回数を取得

with predata as (
select
user_pseudo_id, --ユーザーのCookieIDを取得
(select value.int_value from unnest(event_params) where event_name = 'page_view' and key = 'ga_session_id') as session_id,--ユーザーのセッションIDを取得
case
when (select value.int_value from unnest(event_params) where key = 'entrances') = 1
then (select value.string_value from unnest(event_params) where key = 'page_location')
end as landing_page -- entrancesのパラメータに「1が入ってる場合」page_locationの値をlanding_pageとして扱う
from
    `ha-ga4.analytics_227084301.events_*` -- データの選択範囲。ここでは全期間とし、whereの部分で日付を指定する
where
    _table_suffix between '20220201' and '20220205' -- 日付の指定
    and event_name = 'page_view'-- イベント名を指定
) 
 
select
    landing_page,
    count(distinct concat(user_pseudo_id, "-", session_id)) as entrances --CookieIDとセッションIDをつなげユニーク数をカウントし、流入回数とする
from
    predata--上記2つのデータをpredataのクエリ結果から取得
where
    landing_page is not null --nullが入っていない行のみを表示
group by
    landing_page --ランディングページでグルーピングする
order by
    entrances desc --流入回数の降順に並び替え

実行結果

28:ページごとの流入回数、離脱数、直帰数を取得

with predata as (
select
    event_timestamp,
    user_pseudo_id,  --ユーザーのCookieIDを取得
    (select value.int_value from unnest(event_params) where event_name = 'page_view' and key = 'ga_session_id') as session_id,--ユーザーのセッションIDを取得
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_location --ページURLを取得 
 
from
    `ha-ga4.analytics_227084301.events_*`    -- データの選択範囲。ここでは全期間とし、whereの部分で日付を指定する
where
    _table_suffix between '20220201' and '20220205'  -- 日付の指定
    and  event_name = 'page_view'),  -- イベント名を指定
 
predata2 as (
  SELECT
    page_location, -- ページURLを取得
    case
    when row_number() over(partition by session_id order by event_timestamp) = 1 then 1 else 0 end as entrance,
    case
      when row_number() over(partition by user_pseudo_id, session_id order by  event_timestamp desc) = 1 then 1 else 0
    end as exit, --該当セッションIDで一番最後のpage_viewのタイムスタンプの場合は離脱ページとして1を割り当てる
    case
      when count(1) over(partition by session_id) = 1 then 1 else 0
    end as bounce --該当セッションIDでpage_viewイベントが1つしか存在しない場合は直帰として、1を割り当てる。GA4の直帰(非エンゲージメント)とは違うでの注意
from predata)
 
select 
    page_location as page_location, --ページURLを取得
    sum (entrance) as landing, --ランディングページを合計
    sum (exit) as exit, --離脱ページを合計
    sum(bounce) as bounce  --直帰ページを合計

from
    predata2 --predata2からデータを取得
group by
    page_location --URLでグルーピング
order by
    anding desc --流入回数降順で並び替え

実行結果

※注:ここで取得している直帰率は1ページだけ見て離脱したセッション数を表示しています。GA4内での直帰の定義は非エンゲージメントとなるため、クエリ結果とは数値があいません。


👉 GA4用のBigQuery クエリ集 目次に戻る

前のページ: eコマース・イベント分析クエリ(14〜20)

次のページ: ページ遷移・CV分析クエリ(29〜36)

参考になりましたか?

Google Analytics 4のセミナー講座販売中
活用・実装・改善・LookerStudioなど3時間半で学べる動画+資料を買い切り販売中です。一度購入いただくと、随時アップデートも行われます。