해결된 질문
작성
·
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 인턴입니다. j808esc님.
작성하신 PIVOT 테이블 생성 예제는 퍼널 분석의 기초적인 구조를 이해하는 데 매우 유용한 훈련입니다. 여러분이 데이터를 날짜별로 PIVOT하여 각 화면 뷰 타입에 따라 사용자 수를 집계하는 것을 목표로 합니다. 아래에 몇 가지 피드백을 드립니다:
이름 철자 오류 확인:
scren_view-category
나 scren_view-home
같은 부분을 확인하셔서 철자를 screen
으로 수정해야 합니다. 코드에서 철자가 다르면 결과가 나오지 않을 수 있습니다.찬찬히 쿼리를 실행해 보기:
기타 주의 사항:
MAX
에 NULL
을 사용하는 부분에서 조심스럽게 다룰 필요가 있습니다. 모든 값이 NULL이면 COUNT에서 결과가 나오지 않을 수 있습니다.비슷한 주제를 다룬 기존 질문 및 해결 방법에 대한 다음의 유사한 질문 링크를 참고하시면 도움이 됩니다:
위 링크에서는 PIVOT 및 퍼널 분석 관련 문제 해결에 유용한 실질적인 사례와 다양한 방법을 제공하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.