💡 빅쿼리에서 전환 이벤트를 조회할 때, 유입 시점 검색어는 조회되지 않는 경우가 있습니다. 이 때는 유저 수도 아이디 (user-pseudo-id)를 기준으로 유입 이벤트와 전환 이벤트를 조인해야 합니다.
contents
1. 빅쿼리 전환 이벤트 조회하기
1) 전환 이벤트 조회 쿼리 실행
지난 포스팅에서 사용한 쿼리를 다시 실행해 보겠습니다.
SELECT
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_MICROS(event_timestamp) + INTERVAL 9 HOUR) AS korean_event_timestamp,
event_name,
traffic_source.source,
traffic_source.medium,
traffic_source.name,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'content') AS content,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'term') AS term,
user_pseudo_id
FROM
`project.dataset.table`
WHERE
event_name = '전환체크'
ORDER BY
korean_event_timestamp DESC
LIMIT 1000;
테이블 영역은 실제 테이블 명을 써야 합니다. 자세한 설명은 지난 포스팅을 참고해 주세요.

콘텐츠와 검색어가 null로 나오고 있습니다. 유저 수도 ID는 남아 있으니, 이 ID가 유입되었을 시점의 콘텐츠와 키워드를 불러오도록 하겠습니다.
유저 수도 ID가 궁금하시다면 아래 외부 링크를 확인해 주세요.
2) 빅쿼리 이벤트 조인 쿼리 만들기
다음 쿼리를 실행해 주세요.
WITH key_events AS (
SELECT
user_pseudo_id,
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_MICROS(event_timestamp) + INTERVAL 9 HOUR) AS korean_event_timestamp,
traffic_source.source,
traffic_source.medium,
traffic_source.name,
event_timestamp AS event_timestamp
FROM
`project.dataset.table.events_*`
WHERE
event_name = '전환체크'
),
session_events AS (
SELECT
user_pseudo_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'content') AS content,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'term') AS term,
event_timestamp AS session_event_timestamp
FROM
`project.dataset.table.events_*`
WHERE
event_name = 'session_start'
),
ranked_sessions AS (
SELECT
se.user_pseudo_id,
se.content,
se.term,
se.session_event_timestamp,
ke.event_timestamp AS key_event_timestamp,
ROW_NUMBER() OVER (PARTITION BY ke.user_pseudo_id, ke.event_timestamp ORDER BY se.session_event_timestamp ASC) AS row_num
FROM
key_events ke
LEFT JOIN
session_events se
ON
ke.user_pseudo_id = se.user_pseudo_id
AND
se.session_event_timestamp <= ke.event_timestamp
)
SELECT
ke.korean_event_timestamp,
ke.source,
ke.medium,
ke.name,
rs.content,
rs.term,
ke.user_pseudo_id,
'key events' AS event_name
FROM
key_events ke
LEFT JOIN
ranked_sessions rs
ON
ke.user_pseudo_id = rs.user_pseudo_id
AND
ke.event_timestamp = rs.key_event_timestamp
AND
rs.row_num = 1
ORDER BY
ke.korean_event_timestamp DESC
LIMIT 1000;
*테이블 영역은 실제 빅쿼리 테이블 명을 써야 합니다.
**전환체크에는 여러분이 추적하고 싶은 전환 이벤트 명을 써야 합니다.

이번에는 빅쿼리 전환체크 이벤트와 연결되는 콘텐츠와 키워드가 조회되고 있습니다.
그러면 각 쿼리 영역을 분석해 보겠습니다.
2. 이벤트 조인 쿼리 분석하기
1) Common Table Expressions (CTEs)
WITH key_events AS (
SELECT
user_pseudo_id,
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_MICROS(event_timestamp) + INTERVAL 9 HOUR) AS korean_event_timestamp,
traffic_source.source,
traffic_source.medium,
traffic_source.name,
event_timestamp AS event_timestamp
FROM
`project.dataset.table.events_*`
WHERE
event_name = '전환체크'
),
session_events AS (
SELECT
user_pseudo_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'content') AS content,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'term') AS term,
event_timestamp AS session_event_timestamp
FROM
`project.dataset.table.events_*`
WHERE
event_name = 'session_start'
),
ranked_sessions AS (
SELECT
se.user_pseudo_id,
se.content,
se.term,
se.session_event_timestamp,
ke.event_timestamp AS key_event_timestamp,
ROW_NUMBER() OVER (PARTITION BY ke.user_pseudo_id, ke.event_timestamp ORDER BY se.session_event_timestamp ASC) AS row_num
FROM
key_events ke
LEFT JOIN
session_events se
ON
ke.user_pseudo_id = se.user_pseudo_id
AND
se.session_event_timestamp <= ke.event_timestamp
)
key_events:
- events_*라는 패턴을 가진 여러 테이블에서 데이터를 쿼리합니다.
- 이벤트 이름이 ‘전환체크’인 데이터만 추출합니다.
- user_pseudo_id: user_pseudo_id를 선택합니다.
- FORMAT_TIMESTAMP: 타임스탬프를 한국 시간대로 변환합니다.
- traffic_source: 소스, 매체, 이름(캠페인)을 선택합니다.
- event_timestamp: 이벤트 타임스탬프를 선택합니다.
session_events:
- events_*라는 패턴을 가진 여러 테이블에서 데이터를 쿼리합니다.
- 이벤트 이름이 ‘session_start’인 데이터만 추출합니다.
- user_pseudo_id: user_pseudo_id를 선택합니다.
- content: 콘텐츠 값을 선택합니다.
- term: 검색어 값을 선택합니다.
- event_timestamp: 세션 이벤트 타임스탬프를 선택합니다.
ranked_sessions:
- key_events와 session_events CTEs를 조인하여 세션 이벤트가 전환 이벤트보다 이전인 순서로 랭크를 매깁니다.
- user_pseudo_id: user_pseudo_id를 선택합니다.
- content: 콘텐츠 값을 선택합니다.
- term: 검색어 값을 선택합니다.
- session_event_timestamp: 세션 이벤트 타임스탬프를 선택합니다.
- key_event_timestamp: 전환 이벤트 타임스탬프를 선택합니다.
- ROW_NUMBER(): 각 사용자와 전환 이벤트 타임스탬프를 기준으로 세션 이벤트 순위를 매깁니다.
2) Main Query
SELECT
ke.korean_event_timestamp,
ke.source,
ke.medium,
ke.name,
rs.content,
rs.term,
ke.user_pseudo_id,
'key events' AS event_name
FROM
key_events ke
LEFT JOIN
ranked_sessions rs
ON
ke.user_pseudo_id = rs.user_pseudo_id
AND
ke.event_timestamp = rs.key_event_timestamp
AND
rs.row_num = 1
ORDER BY
ke.korean_event_timestamp DESC
LIMIT 1000;
SELECT 절:
- ke.korean_event_timestamp: 한국 시간대로 변환된 전환 이벤트 타임스탬프를 선택합니다.
- ke.source, ke.medium, ke.name: 소스, 매체, 이름(캠페인)을 선택합니다.
- rs.content, rs.term: 세션 이벤트의 콘텐츠와 검색어 값을 선택합니다.
- ke.user_pseudo_id: user_pseudo_id를 선택합니다.
- ‘key events’ AS event_name: 이벤트 이름을 ‘key events’로 지정합니다.
FROM 절:
- key_events CTE와 ranked_sessions CTE를 조인합니다.
- ON 절에서 user_pseudo_id와 전환 이벤트 타임스탬프를 기준으로 조인합니다.
- rs.row_num = 1: 가장 빠른 세션 이벤트만 선택합니다. (세션 이벤트가 여러개인 경우를 제외하기 위해서)
ORDER BY 절:
- ke.korean_event_timestamp DESC: 한국 시간대로 변환된 전환 이벤트 타임스탬프를 내림차순으로 정렬합니다.
LIMIT 절:
- 최대 1000개의 결과만 반환합니다.
마무리
이번 포스팅에서는 빅쿼리(Big Query)에서 유저 수도 ID (user pseudo id)를 기준으로 전환 이벤트와 세션 이벤트를 조인해서 유입 당시 콘텐츠와 키워드를 추적하는 방식을 알아보았습니다.
감사합니다.
1 thought on “빅쿼리 활용법 (3) 전환 이벤트에서 유입 검색어 조회하기”