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