강의

멘토링

커뮤니티

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

jinnie8230님의 프로필 이미지
jinnie8230

작성한 질문수

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

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

[과제] 퍼널 PIVOT 테이블 작성하기

작성

·

9

·

수정됨

0

안녕하세요 카일님!

강의 너무 잘 듣고 있습니다! 온오프라인에서 SQL실무와 관련된 강의가 없어 많이

고민했는데 카일님 강의 덕분에 입문 강의 부터 정말 많이 배웠습니다 ㅜㅜ!

 

아래 일자별 퍼널을 PIVOT 해보는 쿼리를 짜봤는데 피드백 주시면 너무 감사하겠습니다!

더불어서 PIVOT을 할 때 제가 아래 주석처리한 것들도 디버깅 했을때는 동일하게 나왔는데

혹시나 실무단에서 어떻게 하는건 조심해야한다! 라는 부분이 있을지도 궁금합니다..!

 

항상 감사합니다 :)

 

#일자별 퍼널 PIVOT 
WITH base AS (
SELECT 
  event_date,
  event_timestamp,
  event_name,
  user_id,
  user_pseudo_id,
  platform,
  MAX(IF(param.key = "firebase_screen", param.value.string_value, NULL )) AS firebase_screen,
  -- MAX(IF(param.key = "food_id", param.value.int_value, NULL )) AS food_id,
  MAX(IF(param.key = "session_id", param.value.string_value, NULL )) AS session_id,
  -- param.key AS screen,
  -- param.value.string_value AS string_value,
  -- param.value.int_value AS int_value,
FROM `advanced.app_logs`
CROSS JOIN UNNEST(event_params) AS param
WHERE 
  -- event_date = "2022-08-01" #적은 데이터로 쿼리를 작성하기 위해 만들어둔 조건 
  event_date BETWEEN "2022-08-01" AND "2022-08-18"
GROUP BY ALL

), filter_event_and_concat_event_and_screen AS (
  SELECT 
    * EXCEPT(event_name,firebase_screen),
    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")
), event_by_user_cnt_by_date AS (
--event_name + screen (필요한 이벤트만 WHERE 조건에 걸어서 사용)
--step_number + COUNT 
--step_number : CASE WHEN 사용해 숫자 지정 1~6 (welcome, home, food_category, restaurant, cart )
SELECT 
  -- DISTINCT event_name_with_screen, #해당 열 Unique값 확인 가능 
  event_date, #일자별로 퍼널별 유저수 쿼리
  event_name_with_screen,
  -- event_datetime, user_pseudo_id,
  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-restaurarnt" 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 filter_event_and_concat_event_and_screen
GROUP BY ALL
--screen_view-restaurant/screen_view-food_detail/screen_view-search/screen_view-search_result 도 퍼널 정의에 어떻게 넣을지 생각해보고 단계에 넣어보기 > 고객이 어떤 흐름으로 움직이는지 확인해보기 
HAVING step_number IS NOT NULL 
ORDER BY event_date 
)
SELECT 
  event_date,
  SUM(IF(event_name_with_screen = 'screen_view-welcome', cnt, NULL)) AS screen_view_welcome,
	SUM(IF(event_name_with_screen = 'screen_view-home', cnt, NULL)) AS screen_view_home,
	SUM(IF(event_name_with_screen = 'screen_view-food_category', cnt, NULL )) AS screen_view_food_category,
	SUM(IF(event_name_with_screen = 'screen_view-restaurarnt', cnt, NULL)) AS screen_view_restaurarnt,
	SUM(IF(event_name_with_screen = 'screen_view-cart', cnt, NULL)) AS screen_view_cart,
	SUM(IF(event_name_with_screen = 'click_payment-cart',  cnt, NULL)) AS click_payment_cart,
  -- MAX(IF(event_name_with_screen = 'screen_view-welcome', cnt, NULL)) AS screen_view_welcome,
	-- MAX(IF(event_name_with_screen = 'screen_view-home', cnt, NULL)) AS screen_view_home,
	-- MAX(IF(event_name_with_screen = 'screen_view-food_category', cnt, NULL )) AS screen_view_food_category,
	-- MAX(IF(event_name_with_screen = 'screen_view-restaurarnt', cnt, NULL)) AS screen_view_restaurarnt,
	-- MAX(IF(event_name_with_screen = 'screen_view-cart', cnt, NULL)) AS screen_view_cart,
	-- MAX(IF(event_name_with_screen = 'click_payment-cart',  cnt, NULL)) AS click_payment_cart,
	-- MAX(CASE WHEN event_name_with_screen = 'screen_view-welcome' THEN cnt END) AS screen_view_welcome,
	-- MAX(CASE WHEN event_name_with_screen = 'screen_view-home' THEN cnt END) AS screen_view_home,
	-- MAX(CASE WHEN event_name_with_screen = 'screen_view-food_category'THEN cnt END) AS screen_view_food_category,
	-- MAX(CASE WHEN event_name_with_screen = 'screen_view-restaurarnt'THEN cnt END) AS screen_view_restaurarnt,
	-- MAX(CASE WHEN event_name_with_screen = 'screen_view-cart'THEN cnt END) AS screen_view_cart,
	-- MAX(CASE WHEN event_name_with_screen = 'click_payment-cart'THEN cnt END) AS click_payment_cart
FROM  event_by_user_cnt_by_date 
GROUP BY event_date 
ORDER BY event_date ; 
  •  

답변 1

0

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

강의 이후에도 스스로 퍼널 분석을 위한 PIVOT 테이블을 작성하신 점 매우 인상적입니다. 퍼널(PIVOT) 테이블은 데이터의 흐름을 시각적으로 쉽게 이해할 수 있도록 도와주는 유용한 도구입니다. 아래에 몇 가지 피드백과 함께 실무에서의 주의사항을 안내드리겠습니다.

  1. 쿼리 구조 및 가독성:

    • SUM(IF(..., NULL)) 대신에 SUM(IF(..., 0))을 사용하는 것을 고려해 보세요. 이렇게 하면 데이터가 누락되는 것이 아니라 0으로 표현됩니다.
    • PIVOT 테이블을 작성할 때 복잡한 논리를 좀 더 분명히 할 수 있도록 주석을 활용하는 것이 좋습니다.
  2. 컬럼명 철자 오류:

    • 쿼리 내에서 restaurarnt라는 철자가 여러 번 보이는 점을 확인할 수 있었습니다. 이를 restaurant로 수정하셔야 정확한 결과가 나올 것입니다.
  3. 실무에서의 주의사항:

    • 데이터의 업데이트 경우, 특히 실시간 데이터를 다룰 때 PIVOT 테이블은 과정이 오래 걸릴 수 있으므로 실행 시간을 고려해 주시기 바랍니다.
    • 데이터의 정확성을 유지하기 위해서는 항상 소스 데이터의 변동 여부를 주기적으로 검토하는 것이 좋습니다.
    • 불필요한 연산이 많아질 경우 쿼리 효율성이 떨어질 수 있습니다. 조건이나 연산자를 최대한 간결하게 사용하는 것이 중요합니다.

유사한 주제로 다른 학습자분들이 질문하신 사례들을 참고하실 수 있도록 관련 링크를 제공해 드립니다:
- 1-9 마지막 테이블 피벗 해보기 - 올바르게 만드는 법
- 퍼널 쿼리 작성에 대한 Tip

이 링크들은 퍼널 분석과 PIVOT 테이블 작성 시 주의해야 할 점 및 해결 방법에 대한 유익한 정보를 포함하고 있습니다.

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

jinnie8230님의 프로필 이미지
jinnie8230

작성한 질문수

질문하기