inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

3-14. 섹션 정리

바짝 스터디 3주차 과제 제출

해결된 질문

86

권기영

작성한 질문수 3

0

연습문제 1번

select
*,
TRUNC(user_count / first_count, 3) AS ratio
from
(
  select
  *,
  first_value(user_count) over(order by week_diff asc) as first_count
  from
  (
    select
    week_diff,
    count(*) as user_count
    from
    (
      select
      *,
      date_diff(datetime_week, first_week, week) as week_diff
      from
      (
        select
        distinct
          event_date,
          user_pseudo_id,
          platform,
          datetime_week,
          -- event_name,
          first_value(datetime_week) over (partition by user_pseudo_id order by datetime_week asc) as first_week
        from
        (
          select 
          * except(firebase_screen,event_name),
          DATETIME_TRUNC(CAST(event_date AS DATE), WEEK) AS datetime_week,
          concat(firebase_screen,'_',event_name) as event_name 
          from
          (
            select 
            * except(event_param),
            max(if(event_param.key = 'firebase_screen',event_param.value.string_value , null)) as firebase_screen  
            from
            (
              select 
              event_date, event_timestamp, user_pseudo_id, platform, event_name, event_param 
              from `advanced.app_logs` 
              cross join unnest(event_params) as event_param 
              where event_date >= '2022-08-01' and event_date <= '2022-08-30'
            )
            group by all
          )
        )
      )
    )
    group by week_diff
  )
)
order by week_diff
;

연습문제2

select
user_pseudo_id,
case
  when DATETIME_DIFF(now, datetime_week, WEEK) >= 2 then 'dormant' 
  when DATETIME_DIFF(datetime_week, last_visit_week, WEEK) < 2 and DATETIME_DIFF(now, datetime_week, WEEK) < 2 then 'active'
  when DATETIME_DIFF(datetime_week, last_visit_week, WEEK) >= 2 and DATETIME_DIFF(now, datetime_week, WEEK) < 2 then 'resurrected'
  when DATETIME_DIFF(now, datetime_week, WEEK) < 2 and last_visit_week is null then 'new'
  else null
end as status
from
(
  select
  *,
  rank() over (partition by user_pseudo_id order by event_timestamp desc) as rank
  from
  (
    select
    distinct
      event_date,
      user_pseudo_id,
      platform,
      datetime_week,
      event_timestamp,
      -- event_name,
      -- first_value(datetime_week) over (partition by user_pseudo_id order by datetime_week asc) as first_week
      lag(datetime_week) over(partition by user_pseudo_id order by event_timestamp) as last_visit_week,
      CAST('2022-08-31 00:00:00' AS DATETIME) as now,
    from
    (
      select 
      * except(firebase_screen,event_name),
      DATETIME_TRUNC(CAST(event_date AS DATE), WEEK) AS datetime_week,
      concat(firebase_screen,'_',event_name) as event_name 
      from
      (
        select 
        * except(event_param),
        max(if(event_param.key = 'firebase_screen',event_param.value.string_value , null)) as firebase_screen  
        from
        (
          select 
          event_date, event_timestamp, user_pseudo_id, platform, event_name, event_param 
          from `advanced.app_logs` 
          cross join unnest(event_params) as event_param 
          where event_date >= '2022-08-01' and event_date <= '2022-08-30'
        )
        group by all
      )
    )
  )
  qualify rank=1
)
;

연습문제3, 연습문제4

select
*,
TRUNC(user_count / first_count, 3) AS ratio
from
(
  select
  *,
  first_value(user_count) over(order by week_diff asc) as first_count
  from
  (
    select
    week_diff,
    count(*) as user_count
    from
    (
      select
      *,
      date_diff(datetime_week, first_week, week) as week_diff
      from
      (
        select
        distinct
          user_pseudo_id,
          datetime_week,
          -- event_name,
          first_value(datetime_week) over (partition by user_pseudo_id order by datetime_week asc) as first_week
        from
        (
          select 
          *,
          DATETIME_TRUNC(CAST(event_date AS DATE), WEEK) AS datetime_week
          from
          (
            select 
              event_date, event_timestamp, user_pseudo_id, platform, event_name 
              from `advanced.app_logs` 
              where event_date >= '2022-08-01' and event_date <= '2022-08-30' and event_name='click_restaurant'
          )
        )
      )
    )
    group by week_diff
  )
)
order by week_diff
;

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 권기영님의 질문을 확인하였습니다. 질문에서 제공된 SQL 쿼리를 기반으로 리텐션 분석을 수행하고 계십니다. 몇 가지 핵심 사항과 권기영님께 도움이 될 만한 기존 질문과 답변을 안내해 드리겠습니다.

  1. 리텐션 분석의 기초 개념 정리:

    • 주차별 리텐션 계산을 위해 사용자가 처음 액티브한 주로부터 각 주차간 차이를 계산하고 있음을 확인했습니다. TRUNC를 통해 사용자 수 비율(ratio)을 구하는 전체 프로세스를 잘 따라가고 계십니다.
  2. 상태(Classification) 구분의 로직:

    • 데이터를 통해 사용자의 마지막 활동 시점을 기준으로 ‘dormant’, ‘active’, ‘resurrected’, ‘new’ 상태로 구분하는 로직이 잘 작성되었습니다. 이 부분은 사용자 흐름과 상태 변화를 이해하는데 유용합니다.
  3. 핵심 이벤트 조회 및 비율 분석:

    • 주차별로 특정 이벤트(click_restaurant 등)의 리텐션 비율을 비교하고, 이를 핵심 이벤트로 고려하자는 부분은 실무에서 중요한 인사이트입니다. 

이와 관련된 우리의 기존 데이터에서는 아래의 링크에서 공부할 수 있습니다. 같은 과정에서 제기된 질문이며, 비슷한 SQL 쿼리를 사용해 여러 상태를 분석하고 최적화를 진행하고 있습니다. 이 링크를 통해 더 나은 이해를 도모하시면 좋겠습니다:
-4-8. 지표 정의 연습 문제 풀이 답변 올려볼게요!

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

최종 과제 제출

0

82

3

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

0

84

1

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

0

83

2

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

0

75

2

biquery 테이블 생성 오류 이슈

0

55

2

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

0

73

2

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

0

67

2

array 등

0

63

2

N day 리텐션 쿼리 관련 질문

0

63

2

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

0

69

2

윈도우 연습문제 1번 질문

0

65

1

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

0

72

2

3-13 리텐션 과제 제출

0

94

2

최종 과제 제출

0

130

3

weekly retention 구하기 과제

0

90

2

1-9. 피벗 쿼리 작성

0

81

2

app_logs 테이블 생성 문제

0

73

2

Weekly Retention 구하기 완성하였습니다.

0

77

2

[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료

0

106

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

92

2

정성 데이터 분석 방법 문의

0

165

1

최종 과제 제출

0

108

3

1-6 예시 문제 풀이

0

69

2

최종과제 제출

0

145

2