📊 GA4 BigQuery에서 자주 사용되지만 실수하기 쉬운 함수들

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_timestampuser_first_touch_timestampINT64로 저장된 마이크로초 단위의 타임스탬프입니다. 이를 바로 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_timestampINT64, 반드시 TIMESTAMP_MICROS()로 변환 필요
배열 데이터 처리UNNEST() 사용 시 항상 테이블 별칭과 함께 사용
에러 방지형 캐스팅CAST() 대신 SAFE_CAST()
날짜 vs 타임스탬프DATE_DIFF()DATE 타입, TIMESTAMP_DIFF()TIMESTAMP 전용

이제 GA4 BigQuery 데이터를 분석할 때 함수 하나하나에 더 자신감이 생기셨길 바랍니다. 쿼리는 단순한 코드지만, 해석과 결과는 전혀 다르게 나올 수 있으니, 꼼꼼하게 작성하는 습관이 가장 중요합니다!

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다