2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【BigQuery】日付跨ぎセッションの注意点

Posted at

##はじめに
分析をするにあたって、BigQueryのテーブル構造や指標の出し方に則って、
『1レコード1セッション』にデータを持つと便利。
うまくデータ取得したはずでも『1レコード1セッション』にならないとき、
日付を跨いでいるセッションにポイントがあったのでメモ。

##前提・仮説
◯前提:
 GAのセッションが切れるタイミング:
 ・30分に1度
 ・日にちを跨ぐとき

◯仮説
 BigQueryでの30分に一度、日にち跨ぐとセッションIDが変わっている

#問題
rawテーブルからデータを抜いてきても、1レコード1セッションにならない!
※1意性の判断には、「ユーザーID+セッションID」の複合キーの重複なしカウントを利用します。

##発見
日にち跨ぎ前後でも同じセッションIDが使われている!
(例)

--①rawデータ抜く
SELECT
fullVisitorId,
visitId,
date,
HOUR(DATE_ADD(SEC_TO_TIMESTAMP(visitStartTime), 9, 'HOUR')) AS hour, --時刻(日本時間)
CONCAT(fullVisitorId,STRING(visitId)) AS uniqSessionId --ユニークのセッションIDと定義
FROM (TABLE_DATE_RANGE( [dataset.table_],TIMESTAMP('2018-01-01'), TIMESTAMP('2018-01-02')))
--②日にち跨ぎセッションのユニークIDを指定して、データを確認
SELECT *
FROM ①で作成したテーブル WHERE uniqSessionId = 'aaaaaaaaaaaaaaaaaaabbbbbbbbbb'
fullVisitorId visitId date hour uniqSessionId
aaaaaaaaaaaaaaaa… bbbbbbbbbb 20180101 23 aaaaaaaaaaaaaaaaaaabbbbbbbbbb
aaaaaaaaaaaaaaaa… bbbbbbbbbb 20180102 0 aaaaaaaaaaaaaaaaaaabbbbbbbbbb

##解決策
Dateの箇所だけ初日側に寄せ、『1レコード1セッション』にする。

(例)ユニークのセッションID毎にDATEを元にSEQをふる。⇒次のテーブルでSEQが1のものだけ対象にする。

--SEQを振る
SELECT
uniqSessionId,
COUNT(*) OVER (PARTITION BY uniqSessionId ORDER BY date) AS SEQ,
CONCAT(fullVisitorId,STRING(visitId)) AS uniqSessionId --ユニークのセッションIDと定義
FROM dataset.table

※来訪時セッションを取るのはこれでOK
集約が必要なデータ(ヒット数、CV数など)については、集約関数を利用するべき。
来訪時セッション用と、集約セッション用でテーブルを作成し、新たにテーブルにまとめる。

##注意点
どうしても毀損させたくない・クレンジングしたくない要件がある場合には、
違うやり方をやってみる必要があるかも。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?