
データマネジメントチームの藤井 温子です。
この記事では、データを集計・分析する際に便利な「時点での属性情報の取得」について具体例を交えながらまとめています。データ分析を行う際に「ある時点での属性情報を集計したい」といったことはありませんか?例えば、「購買日時点での、ユーザーの会員ステータスや累計購買額」など、属性情報が時点によって変化する場合がこれにあたります。このようなケースは、JOIN条件で時点を限定することで簡単に実現できます。2つの例を挙げながら見ていきましょう。
【例1】ある購買日時点での、会員のステータスを属性情報として取得する
やりたいこと
2020年4月に購買があった会員の、購買時点での年齢・会員ランク・クラスタを集計したい
使うデータ
- 購買テーブル (transaction)
トランザクションデータ。誰が、いつ、何を買ったかが時系列で記載されている。 - 会員テーブル(member)
属性データだが、生年月日や購買状況から、3ヶ月に1度「年齢」「会員ランク」「クラスタ」が更新されて追記される。

購買日時点での年齢・ランク・クラスタを抽出するクエリは以下のようになります。
SELECT
t1.member
, t2.age
, t2.rank
, t2.cluster
FROM
purchase AS t1
INNER JOIN member AS t2
ON
t1.member_id = t2.member_id
AND TD_TIME_RANGE(t1.time, t2.apply_from, t2.apply_to, 'JST')
WHERE
TD_TIME_RANGE(t1.time, '2020-04-01','2020-05-01', 'JST')
JOIN条件(ON以降)で、購買日時点での最新の会員ステータス更新日のレコードと紐づくようにすることで、購買日時点での会員属性(年齢、ランク、クラスタ)を取得することができます。
【例2】CV発生直前のWeb行動を属性情報として取得する
やりたいこと
2020年4月に資料請求したユーザーの、直前のWeb行動を取得し、流入元や閲覧ページの分析をしたい
使うデータ
- ウェブログテーブル (Weblog)
トランザクションデータ。誰が、いつ、どのページを閲覧したかについて全件格納されている。 - イベントテーブル(event)
資料請求・申し込みなどのイベントデータ。
こちらもトランザクションデータで、誰が、いつ、どのイベントを実行したかについて全件格納されている。

資料請求直前(1日前〜資料請求日時まで)のセッションでのランディングページ・流入元を抽出するクエリは以下のようになります。
-- 1セッション1レコード(日付またぎのセッションは2レコード)のリストを作成
WITH session_list AS (
SELECT
session_id
, client_id
, TD_DATE_TRUNC('day', pv_time, 'JST') as pv_date
, MIN(start_time) as session_start_time
FROM
weblog
WHERE
TD_TIME_RANGE(time, '2020-04-01', '2020-05-01', 'JST')
GROUP BY
td_session_id
, client_id
, TD_DATE_TRUNC('day', pv_time, 'jst')
),
-- 資料請求のイベントとsession_idを紐付ける
event_session_id AS (
SELECT
t1.client_id
t1.event_category
, t1.time AS event_time
, MAX_BY(t2.session_id, t2.session_start_time) AS session_id
FROM
event_log AS t1
LEFT JOIN session_list AS t2
ON
t1.client_id = t2.client_id
and TD_DATE_TRUNC('day', t1.time, 'JST') = t2.pv_date
and t1.time > session_start_time
GROUP BY
t1.client_id
, t1.event_category
, t1.event_time
WHERE
event_category = '資料請求'
)
-- session_idをキーにしてウェブログとイベントログを紐付ける
SELECT
t1.session_id
, t1.client_id
, t1.start_time
, t1.url
, t1.channel_group
, t2.event_time
FROM
weblog AS t1
INNER JOIN event_session_id AS t2
ON t1.session_id = t2.session_id
WHERE
TD_TIME_RANGE(t1.time, '2020-04-01', '2020-05-01', 'JST')
event_session_idの一時テーブルで、JOIN条件(ON以降)を、イベント発生日=ウェブログのPV発生日かつ、イベント発生時刻>セッション開始時刻とすることで、資料請求直前のセッションIDのみをイベントと紐付けて取得することができます。データを集計・分析する際には、時間の取り扱いが重要になります。慣れてしまえば簡単ですが、時点でデータを抽出するのもテクニックの1つとなりますので、今回解説させていただきました。
少しでもご参考になりましたら幸いです。
