inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

[과제] 연습문제 쿼리 작성했습니다!

1

이유정

작성한 질문수 5

0

안녕하세요 카일님,

강의 잘 듣고 있습니다.

연습문제 쿼리 작성해 보았는데 잘못된 부분이 있는지, 더 나은 쿼리 방식이 있다면 피드백 부탁드립니다

감사합니다.


WITH basic AS

(SELECT
  event_date,
  event_name,
  user_pseudo_id,
  event_params,
  if(event_params.key="firebase_screen", event_params.value.string_value, null) as screen
FROM advanced.app_logs
CROSS JOIN UNNEST(event_params) as event_params
WHERE event_date between '2022-08-01' and '2022-08-18'
),

basic2 as (
SELECT
event_date,
concat(event_name, '-', screen) as event_name_with_screen,
COUNT(user_pseudo_id) as cnt
FROM basic
WHERE event_name in ('screen_view', 'click_payment')
GROUP BY ALL
HAVING event_name_with_screen is not null
ORDER BY event_date)

SELECT
event_date,
MAX(if(event_name_with_screen='screen_view-welcome', cnt, null)) as screen_view_welcome,
MAX(if(event_name_with_screen='screen_view-restaurant', cnt, null)) as screen_view_restaurant,
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-food_detail', cnt, null)) as screen_view_food_detail,
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(if(event_name_with_screen='screen_view-search', cnt, null)) as screen_view_search,
MAX(if(event_name_with_screen='screen_view-search_result', cnt, null)) as screen_view_search_result
FROM basic2
GROUP BY all
ORDER BY event_date

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

인프런 AI 인턴

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

작성하신 쿼리는 WITH 절로 단계를 나누고, MAX(IF(...))를 활용해 이벤트별 컬럼으로 피벗한 구조라 전반적인 방향은 좋습니다.

다만 다음 부분은 확인해 보시면 좋습니다.

  • COUNT(user_pseudo_id)는 사용자 수가 아니라 이벤트 행의 개수를 집계합니다. 퍼널별 유저 수를 구하려는 목적이라면 COUNT(DISTINCT user_pseudo_id)를 사용하는 것이 적절합니다.
  • CROSS JOIN UNNEST(event_params) 이후 firebase_screen 파라미터가 아닌 행도 생성되므로, 필요한 파라미터만 추출하거나 MAX(IF(...)) 방식으로 이벤트 단위로 먼저 정리하면 중복 집계를 방지할 수 있습니다.
  • 현재 결과에 값이 없는 단계는 NULL로 표시됩니다. 분석 결과에서 0으로 표시하려면 COALESCE(MAX(IF(...)), 0)처럼 처리할 수 있습니다.
  • 피벗 시 동일한 조건에 여러 행이 생길 수 있는 경우, 단순히 MAX를 사용할지 SUM을 사용할지는 데이터의 중복 여부와 집계 의도에 따라 결정해야 합니다.

유사한 질문과 지식공유자님의 답변을 아래에서 확인해 보세요.

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

6-1. 강의 최종 과제 제출합니다.

0

54

3

3-13 리텐션 과제 제출합니다

0

111

3

3-13. 리텐션 연습과제 제출합니다.

0

84

4

최종 과제 제출

0

68

3

Weekly Retention 과제 작성하였습니다.

0

62

2

3-10 강의 14분경 코호트 해석 질문드립니다.

0

73

2

Weekly 및 Monthly Retention 과제 제출합니다.

0

71

2

[과제] 퍼널 쿼리 PIVOT 테이블 작성

0

72

2

최종 과제 제출

0

142

3

BigQuery 활용편 18강 질문있습니다!

0

110

1

리텐션 공부하다가 궁금한게 생겨 질문드립니다

0

116

2

안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다

0

106

2

biquery 테이블 생성 오류 이슈

0

104

2

동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다

0

109

2

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

0

104

2

array 등

0

90

2

N day 리텐션 쿼리 관련 질문

0

97

2

이동평균 계산 시 order by 기본값은 뭔가요?

0

94

2

윈도우 연습문제 1번 질문

0

91

1

user_id에 NULL이 나오는데 정상인가요?

0

108

2

3-13 리텐션 과제 제출

0

142

2

최종 과제 제출

0

188

3

weekly retention 구하기 과제

0

128

2

1-9. 피벗 쿼리 작성

0

111

2