강의

멘토링

커뮤니티

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

jinnie8230님의 프로필 이미지
jinnie8230

작성한 질문수

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

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

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

해결된 질문

작성

·

22

·

수정됨

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 ; 
  •  

답변 2

0

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

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

현재 SUM으로 PIVOT을 해주셨는데, 지금 쿼리는 MAX나 SUM을 하나 동일한 결과가 나옵니다(SUM 하기 직전에 IF문으로 데이터를 살펴보셔요)

다만 저는 MAX를 선호하는데, 지금 데이터에서는 중복이 없어서 괜찮지만 중복이 있는 경우에 SUM을 해야 하는지 MAX를 해야 하는지 데이터를 보고 결정해야 합니다. 값을 모두 더하고 싶을 땐 SUM, 그게 아니라면 저는 MAX를 선호합니다. SUM을 하실거라면 인프런 AI 인턴의 말처럼 참이 아닐 때 0이라고 해주시는게 좋긴 합니다. 만약 NULL이랑 숫자가 SUM을 하면 NULL이 나오거든요!

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

작성한 질문수

질문하기