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

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

전성배님의 프로필 이미지

작성한 질문수

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

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

1-9 마지막 테이블 피벗 해보기

해결된 질문

작성

·

62

0

안녕하세요 카일님

강의 마지막에 주신 연습문제 해보았습니다.

 

  1. PIVOT에 어떤 연산자를 사용할 것인가?

    1. MAX로 할 경우 -> 별도의 연산된 결과값이 있는 base`가 필요할 것 같음. 이 경우 강의 중 작성된 cnt를 참조하여 작성할 수 있을 것 같으나 3중 쿼리라는게 마음에 걸림.

    2. SUM으로 할 경우 -> 강의 중 작성한 base 만으로 충분할 것 같음. 2중 쿼리로 충분해보임.

따라서 B안으로 작성해보았습니다.

WITH base AS (
  SELECT
    event_date,
    event_timestamp,
    event_name,
    user_id,
    user_pseudo_id,
    platform,
    -- event_param,
    MAX(IF(event_param.key = 'firebase_screen',event_param.value.string_value, NULL)) AS firebase_screen,
    -- MAX(IF(event_param.key = 'food_id',event_param.value.int_value, NULL)) AS food_id,
    MAX(IF(event_param.key = 'session_id',event_param.value.string_value, NULL)) AS session_id,
  FROM advanced.app_logs
  CROSS JOIN UNNEST(event_params) AS event_param
  WHERE 
    -- event_date = '2022-08-01' -> 적은 데이터로 쿼리를 작성하기 위해 입력한 임시 조건
    event_date BETWEEN '2022-08-01' AND '2022-08-18'
  GROUP BY ALL
  -- LIMIT 100 -> 기초 구문 작성 완료 시 삭제 필요!
), filter_event_and_concat_event_and_screen AS (
-- name, screen concatate (필요한 이벤트만 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')
)
# PIVOT 연습문제
SELECT
  event_date,
  SUM(IF(event_name_with_screen = 'screen_view-welcome',1,0)) AS `screen_view-welcome`,
  SUM(IF(event_name_with_screen = 'screen_view-home',1,0)) AS `screen_view-home`,
  SUM(IF(event_name_with_screen = 'screen_view-food_category',1,0)) AS `screen_view-food_category`,
  SUM(IF(event_name_with_screen = 'screen_view-restaurant',1,0)) AS `screen_view-restaurant`,
  SUM(IF(event_name_with_screen = 'screen_view-cart',1,0)) AS `screen_view-cart`,
  SUM(IF(event_name_with_screen = 'click_payment=cart',1,0)) AS `click_payment-cart`,
FROM filter_event_and_concat_event_and_screen
GROUP BY ALL
ORDER BY event_date ASC 

답변 2

1

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

성배님 안녕하세요! 잘 푸셨네요..!! 고생하셨습니다

강의에서 다루진 않았지만, PIVOT 함수가 있긴 합니다. 추가적으로 이 함수 한번 써보시는 것은 어떨까요? 이렇게 하는 것도 있구나! 익히시면 학습 과정에서 도움될 것 같아 말씀드려요

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

https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#pivot_operator

0

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

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

PIVOT 쿼리를 적절히 활용하여 데이터를 변환하는 방법에 대해 고민하신 것을 확인했습니다. 쿼리를 작성할 때 사용할 수 있는 연산자와 그에 따른 쿼리 복잡도에 대해 잘 이해하셨습니다.

SQL의 PIVOT 기능을 활용하여 데이터의 특정 값을 분석하는 것은 매우 강력한 도구입니다. 여기에는 몇 가지 방법이 있으며, MAX와 SUM을 사용할 때의 차이점을 명확히 파악하신 점이 좋습니다.

PIVOT 처리의 경우, 사건의 수를 단순히 계산하기 위해 SUM을 사용한 방법은 아주 깔끔하고 효율적입니다. 이와 같은 방식은 각 이벤트에 대해 1을 더해가며 총 이벤트 수를 구하는데 적합합니다.

한 가지 덧붙이자면, MAX(IF(...))를 사용하는 경우는 특정 집계가 필요할 때 주로 사용됩니다. 예를 들어, 최댓값이나 특정 조건의 값을 선택해야 할 때입니다.

아래는 기존에 비슷한 주제로 다루어진 링크입니다. 도움이 될 수 있는 실질적인 사례들을 포함하고 있습니다:
- 퍼널 SQL 쿼리 작성하기 - 오류 해결 사례

위 링크에서는 퍼널 SQL을 작성할 때의 구체적인 문제와 해결 방안이 제시되어 있습니다. 다양한 사례를 통해 실수를 줄이고 원하는 결과를 얻을 수 있을 것입니다.

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