인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

j808esc님의 프로필 이미지

작성한 질문수

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

1-9. 퍼널 SQL 쿼리 작성하기

1-9. [자습] PIVOT 테이블 생성하기

해결된 질문

작성

·

62

0

WITH base as (
SELECT
  event_date,
  event_timestamp,
  event_name,
  user_id,
  user_pseudo_id,
  platform,
  MAX(IF(params.key='firebase_screen', params.value.string_value, NULL)) as firebase_screen,
  -- MAX(IF(params.key='food_id', params.value.int_value, NULL)) as food_id,
  MAX(IF(params.key='session_id', params.value.string_value, NULL)) as session_id,
FROM advanced.app_logs
CROSS JOIN UNNEST(event_params) as params
WHERE
  -- event_date = "2022-08-01" # 적은 데이터로 쿼리를 작성하기 위해 만든 조건
  event_date BETWEEN "2022-08-01" AND "2022-08-18"
GROUP BY ALL
), fileter_event_and_concat_event_and_screen AS(
-- event_name + screen 하면서(필요한 이벤트만 WHERE 조건에 걸어서 사용)
  SELECT
    * EXCEPT(event_name, firebase_screen, event_timestamp),
    CONCAT(event_name, "-", firebase_screen) AS event_name_with_screen,
    DATETIME(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul") AS event_datetime
  FROM base
  WHERE
    event_name IN("screen_view", "click_payment")
)
-- step_number + cnt 만들기
-- step_number : CASE WHEN을 사용해 숫자 지정
, pivot_base as 
(
SELECT
  event_date, # 일자별로 퍼널별 유저 수 쿼리, 일자별로 처리하기 위해 event_date 추가
  event_name_with_screen,
  CASE
    WHEN event_name_with_screen = 'screen_view-welcome' THEN 1
    WHEN event_name_with_screen = 'screen_view-home' THEN 2
    WHEN event_name_with_screen = 'screen_view-food_category' THEN 3
    WHEN event_name_with_screen = 'screen_view-restaurant' THEN 4
    WHEN event_name_with_screen = 'screen_view-cart' THEN 5
    WHEN event_name_with_screen = 'click_payment-cart' THEN 6
  ELSE NULL
  END AS step_number,
  COUNT(DISTINCT user_pseudo_id) as cnt
FROM fileter_event_and_concat_event_and_screen
GROUP BY ALL
HAVING step_number IS NOT NULL
ORDER BY event_date
-- WHERE 
  -- user_pseudo_id = "2173465695.8694960923"
  -- user_pseudo_id = "2173465695.8694960923" :event_name_with_screen =  screen_view-welcome의 user_id는 NULL -> home에서 로그인
-- food_detal, search 등 event_name_with_scree의 여러 요소들을 확인해보기
)

# [자습] 위 테이블을 screen_view 타입별로 피벗 테이블 만들기 쿼리 (위 테이블을 with 절로 만들고 아래 쿼리 실행)
SELECT
  event_date,
  MAX(IF(event_name_with_screen="screen_view-welcome", cnt, NULL)) as `scren_view-welcome`,
  MAX(IF(event_name_with_screen="screen_view-home", cnt, NULL)) as `scren_view-home`,
  MAX(IF(event_name_with_screen="screen_view-food_category", cnt, NULL)) as `scren_view-category`,
  MAX(IF(event_name_with_screen="screen_view-restaurant", cnt, NULL)) as `scren_view-restaurant`
FROM pivot_base
GROUP BY event_date
ORDER BY event_date

과제 올립니다 감사합니다

답변 2

1

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

안녕하세요! 쿼리 잘 작성해주셨네요!

이 기세를 모아 다른 부분도 학습해보셔요.

만약 시간이 남으시면 PIVOT 하는 다른 방법도 있는데, 이 방법도 한번 학습해보시는 것도 추천드려요

https://zzsza.github.io/gcp/2021/05/16/bigquery-pivot/

 

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. j808esc님.

작성하신 PIVOT 테이블 생성 예제는 퍼널 분석의 기초적인 구조를 이해하는 데 매우 유용한 훈련입니다. 여러분이 데이터를 날짜별로 PIVOT하여 각 화면 뷰 타입에 따라 사용자 수를 집계하는 것을 목표로 합니다. 아래에 몇 가지 피드백을 드립니다:

  1. 이름 철자 오류 확인:

    • PIVOT 쿼리의 결과 집계 컬럼명에서 scren_view-categoryscren_view-home 같은 부분을 확인하셔서 철자를 screen으로 수정해야 합니다. 코드에서 철자가 다르면 결과가 나오지 않을 수 있습니다.
  2. 찬찬히 쿼리를 실행해 보기:

    • 전체 쿼리를 하나씩 나누어 실행해 보면서, 중간 결과가 예상대로 나오는지 확인해 보세요. 이렇게 하면 오류를 찾기 쉽고, 코드가 예상한 대로 작동하는지 확실히 할 수 있습니다.
  3. 기타 주의 사항:

    • MAXNULL을 사용하는 부분에서 조심스럽게 다룰 필요가 있습니다. 모든 값이 NULL이면 COUNT에서 결과가 나오지 않을 수 있습니다.
    • 일부 무시되거나 체크가 필요할 수 있는 주석은 제거하여 더 명확한 쿼리를 작성하는 것이 좋습니다.

비슷한 주제를 다룬 기존 질문 및 해결 방법에 대한 다음의 유사한 질문 링크를 참고하시면 도움이 됩니다:

위 링크에서는 PIVOT 및 퍼널 분석 관련 문제 해결에 유용한 실질적인 사례와 다양한 방법을 제공하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

j808esc님의 프로필 이미지

작성한 질문수

질문하기