답변
먼저 GA4 BigQuery 내보내기의 구조부터 알아야 쿼리를 짤 수 있습니다. GA4를 BigQuery로 내보내면 이벤트 단위로 하루치 데이터가 event_date 기준 테이블(events_YYYYMMDD)에 쌓이고, event_params·user_properties·items 같은 필드는 중첩·반복 레코드 구조로 들어옵니다. 일반 관계형 테이블처럼 SELECT event_params.value만으로는 값을 못 꺼내고, UNNEST() 함수로 배열을 펼친 뒤 원하는 key를 필터링해야 값을 추출할 수 있다는 게 가장 기본적인 특징입니다. 기본 쿼리 템플릿 패턴은 'SELECT user_pseudo_id, (SELECT value.int_value FROM UNNEST(event_params) WHERE key = "ga_session_id") AS session_id, event_name, event_timestamp FROM `프로젝트.analytics_속성ID.events_*` WHERE _TABLE_SUFFIX BETWEEN "20260801" AND "20260831"'처럼, 서브쿼리로 UNNEST(event_params)에서 원하는 key의 값을 뽑고, 와일드카드 테이블에 _TABLE_SUFFIX 조건으로 조회 기간을 지정하는 구조입니다. 마이크로 세그먼트는 user_pseudo_id로 GROUP BY 한 뒤 COUNTIF·SUM 같은 집계함수와 HAVING 절 조건을 조합해 만듭니다. 예를 들어 '최근 30일 내 특정 페이지를 3회 이상 방문했지만 구매는 안 한 유저'는 'GROUP BY user_pseudo_id HAVING COUNTIF(event_name="page_view" AND 페이지조건) >= 3 AND COUNTIF(event_name="purchase") = 0' 같은 패턴으로 정의합니다. HAVING에 조건을 계속 추가하면 세그먼트를 더 세밀하게 좁힐 수 있습니다. 마지막으로 비용 관리를 꼭 챙기셔야 합니다. BigQuery는 스캔한 데이터량 기준으로 과금되므로, _TABLE_SUFFIX 조건 없이 전체 events_* 테이블을 스캔하는 쿼리를 실수로 돌리면 비용이 크게 늘 수 있습니다. 조회 기간을 반드시 _TABLE_SUFFIX BETWEEN으로 제한하고, 콘솔의 '쿼리 유효성 검사기'로 실행 전 예상 스캔 용량을 확인하는 습관을 들이시길 권합니다.