Skip to content

πŸ“Š GA4 BigQueryμ—μ„œ 자주 μ‚¬μš©λ˜μ§€λ§Œ μ‹€μˆ˜ν•˜κΈ° μ‰¬μš΄ ν•¨μˆ˜λ“€

Written on 2025λ…„ 04μ›” 15일 by seonice90

Categories: Bigquery ν•¨μˆ˜

Tags: , , , , , ,

GA4 데이터λ₯Ό BigQueryμ—μ„œ λΆ„μ„ν•˜λ‹€ 보면 자주 μ‚¬μš©ν•˜κ²Œ λ˜λŠ” ν•¨μˆ˜λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 아무리 자주 μ“°λŠ” ν•¨μˆ˜λΌλ„, 쑰금만 λ°©μ‹¬ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•˜κ±°λ‚˜ 잘λͺ»λœ κ²°κ³Όλ₯Ό λ§Œλ“€μ–΄λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

이 κΈ€μ—μ„œλŠ” μ‹€λ¬΄μ—μ„œ 자주 ν™œμš©λ˜λ©΄μ„œλ„ μ‰½κ²Œ μ‹€μˆ˜ν•  수 μžˆλŠ” ν•¨μˆ˜λ“€μ„ μ†Œκ°œν•˜κ³ , 잘λͺ»λœ μ‚¬μš© μ˜ˆμ™€ μ˜¬λ°”λ₯Έ μ‚¬μš© 예λ₯Ό λΉ„κ΅ν•˜λ©° μ„€λͺ…ν•΄ λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.


1. UNNEST() – λ°°μ—΄ νŽΌμΉ˜κΈ°μ—μ„œ 별칭 λˆ„λ½ μ‹€μˆ˜

GA4 이벀트 λ°μ΄ν„°μ—λŠ” event_params, items 같은 λ°°μ—΄ ν˜•νƒœμ˜ 컬럼이 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό λΆ„μ„ν•˜κΈ° μœ„ν•΄μ„œλŠ” UNNEST()λ₯Ό μ‚¬μš©ν•˜λŠ”λ°, 별칭 없이 μ‚¬μš©ν•  경우 μ—λŸ¬κ°€ λ‚©λ‹ˆλ‹€.

❌ 잘λͺ»λœ μ‚¬μš© 예

SELECT user_pseudo_id, event_name, key, value.string_value
FROM `project.dataset.events_*`,
UNNEST(event_params)

βœ… μ˜¬λ°”λ₯Έ μ‚¬μš© 예

SELECT
  e.user_pseudo_id,
  e.event_name,
  p.key,
  p.value.string_value
FROM `project.dataset.events_*` AS e,
UNNEST(e.event_params) AS p

UNNEST()μ—λŠ” λ°˜λ“œμ‹œ μ–΄λ–€ ν…Œμ΄λΈ”μ˜ μ»¬λŸΌμΈμ§€ λͺ…ν™•ν•˜κ²Œ μ•Œλ €μ€˜μ•Ό ν•©λ‹ˆλ‹€.


2. DATE_DIFF() – TIMESTAMP와 DATE νƒ€μž… ν˜Όλ™

GA4의 event_timestampλ‚˜ user_first_touch_timestampλŠ” INT64둜 μ €μž₯된 마이크둜초 λ‹¨μœ„μ˜ νƒ€μž„μŠ€νƒ¬ν”„μž…λ‹ˆλ‹€. 이λ₯Ό λ°”λ‘œ DATE_DIFF()에 μ‚¬μš©ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

❌ 잘λͺ»λœ μ‚¬μš© 예

SELECT DATE_DIFF(event_timestamp, user_first_touch_timestamp, DAY)
FROM `project.dataset.events_*`

βœ… μ˜¬λ°”λ₯Έ μ‚¬μš© 예

SELECT
  DATE_DIFF(DATE(TIMESTAMP_MICROS(event_timestamp)), DATE(TIMESTAMP_MICROS(user_first_touch_timestamp)), DAY) AS days_since_first_touch
FROM `project.dataset.events_*`

TIMESTAMP_MICROS()λ₯Ό 톡해 timestamp둜 λ³€ν™˜ν•˜κ³ , DATE()둜 λ³€ν™˜ν•œ ν›„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.


3. SAFE_CAST() – νƒ€μž… λ³€ν™˜ μ‹œ 쿼리 μ‹€νŒ¨ λ°©μ§€

λ¬Έμžν˜• 값을 μˆ«μžν˜•μœΌλ‘œ λ³€ν™˜ν•  λ•Œ CAST()λ₯Ό μ“°λ©΄ λ³€ν™˜ μ‹€νŒ¨ μ‹œ 쿼리 μžμ²΄κ°€ μ€‘λ‹¨λ©λ‹ˆλ‹€. 이럴 땐 SAFE_CAST()λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆμ „ν•©λ‹ˆλ‹€.

❌ 잘λͺ»λœ μ‚¬μš© 예

SELECT CAST(p.value.string_value AS INT64)
FROM `project.dataset.events_*` AS e,
UNNEST(e.event_params) AS p

βœ… μ˜¬λ°”λ₯Έ μ‚¬μš© 예

SELECT SAFE_CAST(p.value.string_value AS INT64)
FROM `project.dataset.events_*` AS e,
UNNEST(e.event_params) AS p
WHERE p.key = "screen_view_count"

μˆ«μžκ°€ μ•„λ‹Œ 값이 λ“€μ–΄ μžˆμ–΄λ„ NULL둜 μ²˜λ¦¬λ˜μ–΄ 쿼리가 μ‹€νŒ¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


4. REGEXP_EXTRACT() – μ •κ·œν‘œν˜„μ‹ κ·Έλ£Ή μΆ”μΆœ μ‹€μˆ˜

μ •κ·œν‘œν˜„μ‹μ—μ„œ μ›ν•˜λŠ” 값을 μΆ”μΆœν•˜λ €λ©΄ κ΄„ν˜Έλ‘œ 그룹을 잘 μ§€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

❌ 잘λͺ»λœ μ‚¬μš© 예

SELECT REGEXP_EXTRACT(page_location, '/jobs/\d+')

βœ… μ˜¬λ°”λ₯Έ μ‚¬μš© 예

SELECT REGEXP_EXTRACT(page_location, r'/jobs/(\d+)') AS job_id

첫 번째 κ΄„ν˜Έλ‘œ 감싼 그룹만 μΆ”μΆœλ©λ‹ˆλ‹€. r'' λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•˜λ©΄ μ΄μŠ€μΌ€μ΄ν”„ 였λ₯˜λ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.


5. ROW_NUMBER() – νŒŒν‹°μ…”λ‹ λˆ„λ½ μ‹€μˆ˜

μ‚¬μš©μžλ³„ 첫 이벀트λ₯Ό ꡬ할 λ•Œ 자주 μ“°λŠ” ν•¨μˆ˜μ§€λ§Œ, PARTITION BYλ₯Ό λˆ„λ½ν•˜λ©΄ μ „ 데이터 κΈ°μ€€μœΌλ‘œ μ •λ ¬λ©λ‹ˆλ‹€.

❌ 잘λͺ»λœ μ‚¬μš© 예

SELECT
  user_pseudo_id,
  event_timestamp,
  ROW_NUMBER() OVER (ORDER BY event_timestamp) AS rn
FROM `project.dataset.events_*`

βœ… μ˜¬λ°”λ₯Έ μ‚¬μš© 예

SELECT *
FROM (
  SELECT
    user_pseudo_id,
    event_timestamp,
    ROW_NUMBER() OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS rn
  FROM `project.dataset.events_*`
)
WHERE rn = 1

μœ μ €λ³„ 첫 행동을 ꡬ할 λ•Œ λ°˜λ“œμ‹œ PARTITION BYλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.


6. IFNULL()κ³Ό COALESCE() – ν•¨μˆ˜ μš©λ„ ν˜Όλ™

IFNULL()은 두 개의 인자만 받을 수 있으며, μ—¬λŸ¬ λŒ€μ²΄κ°’μ΄ μžˆμ„ 땐 COALESCE()λ₯Ό 써야 ν•©λ‹ˆλ‹€.

❌ 잘λͺ»λœ μ‚¬μš© 예

SELECT IFNULL(event_params.value.int_value, 0, 1)

βœ… μ˜¬λ°”λ₯Έ μ‚¬μš© 예

-- NULL이면 0으둜 λŒ€μ²΄
SELECT IFNULL(event_params.value.int_value, 0)

-- μ—¬λŸ¬ λŒ€μ²΄κ°’ 쀑 첫 번째 NULL이 μ•„λ‹Œ κ°’ λ°˜ν™˜
SELECT COALESCE(NULL, NULL, 5, 10) -- κ²°κ³Ό: 5

마무리: GA4 BigQueryμ—μ„œ 자주 ν•˜λŠ” μ‹€μˆ˜, μ΄λ ‡κ²Œ λ°©μ§€ν•˜μ„Έμš”

주의 ν¬μΈνŠΈμ„€λͺ…
데이터 νƒ€μž… 확인event_timestampλŠ” INT64, λ°˜λ“œμ‹œ TIMESTAMP_MICROS()둜 λ³€ν™˜ ν•„μš”
λ°°μ—΄ 데이터 처리UNNEST() μ‚¬μš© μ‹œ 항상 ν…Œμ΄λΈ” 별칭과 ν•¨κ»˜ μ‚¬μš©
μ—λŸ¬ λ°©μ§€ν˜• μΊμŠ€νŒ…CAST() λŒ€μ‹  SAFE_CAST()
λ‚ μ§œ vs νƒ€μž„μŠ€νƒ¬ν”„DATE_DIFF()λŠ” DATE νƒ€μž…, TIMESTAMP_DIFF()λŠ” TIMESTAMP μ „μš©

이제 GA4 BigQuery 데이터λ₯Ό 뢄석할 λ•Œ ν•¨μˆ˜ ν•˜λ‚˜ν•˜λ‚˜μ— 더 μžμ‹ κ°μ΄ 생기셨길 λ°”λžλ‹ˆλ‹€. μΏΌλ¦¬λŠ” λ‹¨μˆœν•œ μ½”λ“œμ§€λ§Œ, 해석과 κ²°κ³ΌλŠ” μ „ν˜€ λ‹€λ₯΄κ²Œ λ‚˜μ˜¬ 수 μžˆμœΌλ‹ˆ, κΌΌκΌΌν•˜κ²Œ μž‘μ„±ν•˜λŠ” μŠ΅κ΄€μ΄ κ°€μž₯ μ€‘μš”ν•©λ‹ˆλ‹€!



λ‹΅κΈ€ 남기기

이메일 μ£Όμ†ŒλŠ” κ³΅κ°œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•„μˆ˜ ν•„λ“œλŠ” *둜 ν‘œμ‹œλ©λ‹ˆλ‹€

Powered by WordPress