inflearn logo
강의

Khóa học

Chia sẻ kiến thức

BigQuery(SQL) ứng dụng nâng cao (phân tích phễu, phân tích retention)

1-9. Viết truy vấn SQL phễu

[과제]1-9 피벗 테이블 만들어보기

2

naye7255833

2 câu hỏi đã được viết

0

안녕하세요.

강의 마지막 부분의 피벗 과제 올려봅니다.

감사합니다.!

WITH base AS(
  SELECT
    user_id,
    event_date,
    event_name,
    event_timestamp,
    user_pseudo_id,
    MAX(IF(ep.key = "firebase_screen",ep.value.string_value,NULL)) AS firebase_screen,
    MAX(IF(ep.key = "food_id",ep.value.int_value,NULL)) AS food_id,
    MAX(IF(ep.key = "session_id",ep.value.string_value,NULL)) AS session_id
  FROM advanced.app_logs
  CROSS JOIN UNNEST(event_params) AS ep
  WHERE event_date BETWEEN "2022-08-01" AND "2022-08-18"
  GROUP BY ALL
), filter_event_name_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")
)

SELECT
  * EXCEPT (step_number, event_name_with_screen,cnt),
  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-restaurant",cnt,NULL)) AS `screen_view-restaurant`,
  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`,
FROM
(
  SELECT
  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(user_pseudo_id) AS cnt
FROM filter_event_name_screen
GROUP BY ALL
HAVING step_number IS NOT NULL
--ORDER BY step_number
)
GROUP BY ALL
ORDER BY event_date

sql Google-Analytics firebase google-sheets bigquery

Câu trả lời 1

0

communityai8509

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

피벗 구조를 잘 작성하셨습니다. event_name_with_screen별로 step_number와 cnt를 만든 뒤, 바깥쪽에서 MAX(IF(...))를 사용해 날짜별 컬럼으로 변환하는 방식은 강의의 의도와 동일합니다.

다만 퍼널별 사용자 수를 계산하려는 목적이라면 다음 부분을 확인해 주세요.

COUNT(user_pseudo_id) AS cnt

현재 쿼리는 동일 사용자가 같은 화면을 여러 번 조회한 경우 조회 횟수까지 모두 집계합니다. 사용자 수를 구하려면 아래처럼 DISTINCT를 사용하는 것이 일반적입니다.

COUNT(DISTINCT user_pseudo_id) AS cnt

또한 SELECT * EXCEPT (...)와 GROUP BY ALL을 활용한 방식도 BigQuery에서는 동작하지만, 실무에서는 결과에 필요한 컬럼인 event_date를 명시적으로 작성하면 쿼리의 의도가 더 분명해집니다.

관련된 기존 답변을 함께 참고해 보세요.

위 게시물에서도 MAX(IF(...))를 활용한 피벗 방식과 COUNT(DISTINCT user_pseudo_id)를 사용한 퍼널 사용자 수 집계 방법을 확인할 수 있습니다.

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

cnt수를 구할 때 왜 user_pseudo_id 를 사용하나요?

0

8

1

최종 과제 제출합니다.

0

74

2

3-13 과제

0

75

3

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

0

81

2

app logs 데이터로 쿼리 연습

0

84

2

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

0

76

2

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

0

90

3

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

0

154

3

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

0

124

4

최종 과제 제출

0

98

3

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

0

77

2

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

0

86

2

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

0

82

2

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

0

96

2

최종 과제 제출

0

166

3

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

0

121

1

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

0

134

2

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

0

127

2

biquery 테이블 생성 오류 이슈

0

125

2

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

0

128

2

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

0

135

2

array 등

0

113

2

N day 리텐션 쿼리 관련 질문

0

116

2

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

0

116

2