Inflearn brand logo image

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

Min님의 프로필 이미지
Min

작성한 질문수

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

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

1-9. 피벗 쿼리 작성

해결된 질문

작성

·

32

0

안녕하세요.

수업 잘 듣고 있습니다.

말씀 해 주신대로 풀이 보기 전에 풀어보고 다시 영상보고하니 재미도 있고 실력도 빨리 느는 것 같아요. 감사합니다!

1-9 강의에서 주신 피벗 쿼리 작성해 봤습니다!


WITH funnel_base AS (
  SELECT
    event_date,
    event_timestamp,
    event_name,
    -- params.key AS key,
    -- params.value.string_value AS string_value,
    -- params.value.int_value AS int_value,
    user_id,
    user_pseudo_id,
    platform,
    MAX(IF(params.key="firebase_screen",params.value.string_value,NULL))AS firebase_screen,
    MAX(IF(params.key="session_id",params.value.string_value,NULL))AS session_id,
    -- MAX(IF(params.key="food_id",params.value.int_value,NULL))AS food_id

    FROM 
  `advance.app_logs`
  CROSS JOIN 
  UNNEST (event_params) AS params
  WHERE 
    event_date BETWEEN "2022-08-01" AND "2022-08-18"
  GROUP BY ALL
), filter_event AS (

-- event_name+screen 
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_timestamp
FROM 
funnel_base
WHERE 
  event_name IN ('screen_view', 'click_payment')
), funnel_step AS (

SELECT
  event_date,
  filter_event.event_name_with_screen,
  CASE
    WHEN filter_event.event_name_with_screen = 'screen_view-welcome' THEN 1
    WHEN filter_event.event_name_with_screen = 'screen_view-home' THEN 2
    WHEN filter_event.event_name_with_screen = 'screen_view-food_category' THEN 3
    WHEN filter_event.event_name_with_screen = 'screen_view-restaurant' THEN 4
    WHEN filter_event.event_name_with_screen = 'screen_view-cart' THEN 5
    WHEN filter_event.event_name_with_screen = 'click_payment-cart' THEN 6
  ELSE NULL
  END AS step_number,
  COUNT(user_pseudo_id) AS cnt
FROM filter_event
WHERE 
  event_date BETWEEN "2022-08-01" AND "2022-08-15"
GROUP BY ALL
HAVING
step_number IS NOT NULL)

--3. event_name_with_screen 컬럼으로, 일자별로 count
SELECT
  event_date,
  SUM(IF(funnel_step.event_name_with_screen = "screen_view-welcome", cnt, null)) AS `screen_view-welcome`,
  SUM(IF(funnel_step.event_name_with_screen = "screen_view-home", cnt, null)) AS `screen_view-home`,
  SUM(IF(funnel_step.event_name_with_screen = "screen_view-food_category", cnt, null)) AS `screen_view-food_category`,
  SUM(IF(funnel_step.event_name_with_screen = "screen_view-restaurant", cnt, null)) AS `screen_view-restaurant`,
  SUM(IF(funnel_step.event_name_with_screen = "screen_view-cart", cnt, null)) AS `screen_view-cart`,
  SUM(IF(funnel_step.event_name_with_screen = "click_payment-cart", cnt, null)) AS `click_payment-cart`

FROM 
funnel_step
GROUP BY ALL
ORDER BY 
  event_date

답변 2

0

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

Min님 안녕하세요!

제가 공유드린 흐름으로 공부해주셔서 감사합니다. 직접 짜보고 제 쿼리랑 비교해보면 어떤 부분에서 생각이 달랐는지 알 수 있고, 이 부분이 저의 암묵지라고 할 수 있더라구요. 그 부분을 모두 다 학습해주셔요

 

쿼리는 잘 작성해주셨고, BigQuery에 PIVOT 함수가 사실 있어요. 다만 자유도가 떨어지고 PIVOT 함수가 없는 DB도 있어서 강의에서 설명드린 방식을 선호하는 편이에요.

강의에서 설명드린 방식을 모두 익히셨으니, 그 다음으로 PIVOT 쿼리도 한번 살펴보셔요!

아래 글에서 확인하실 수 있어요

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

 

공부 계속 파이팅입니다!

0

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

수업을 잘 따라가고 계신 것 같아 기쁩니다. 피벗 쿼리를 작성하신 것에 대해 잘 수행하셨습니다. 각 단계별로 데이터를 집계하고 변환하는 과정을 PIVOT 기법을 통해 실현하셨는데요, 몇 가지 피드백 드리겠습니다.

  1. GROUP BY ALL의 사용:

    • GROUP BY ALL은 모든 열을 그룹화하는 것이 아니라, 특정 열에 대해서만 그룹핑하는 것이 일반적입니다. 여기서는 event_date만으로 그룹화하는 것이 필요합니다.
  2. IF문 대체:

    • SUM(IF(..., cnt, null))에서 null보다는 0을 사용하는 것이 더 안전할 수 있습니다. 이는 계수가 없는 경우 0으로 처리하기 위함입니다.
  3. 피벗 함수 활용:

    • 현재 사용하는 PIVOT 기법은 상당히 일반적이고 효과적이지만, BigQuery에서는 PIVOT 함수를 활용해 볼 수도 있습니다. 이는 다양한 사용 사례에 유용할 수 있습니다.
  4. 쿼리 검증:

    • 쿼리 전녁을 단계별로 실행해 보며 예측 결과가 맞는지 검증해 보세요. 중간값이 예상한 대로 나오는지 확인하는 것이 중요합니다.

다음 링크들은 유사한 과제와 그 해결 방안을 찾는 데 도움이 될 것입니다:

이 링크들은 PIVOT 및 퍼널 쿼리를 작성할 때 발생할 수 있는 다양한 문제와 해결 방법을 제시하고 있습니다.

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

Min님의 프로필 이미지
Min

작성한 질문수

질문하기