연습과제

Weekly Retention을 구하는 쿼리를 바닥부터 스스로 작성해보세요.


SQL

WITH base AS(
  SELECT
    DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_date,
    DATE_TRUNC(DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul'), WEEK(MONDAY)) AS event_week,
    event_name,
    user_pseudo_id
  FROM advanced.app_logs
), week_diff_data AS(
  #first_week, weeks_after_first_week 추출
  SELECT
    *,
    DATE_DIFF(event_week, first_week, WEEK(MONDAY)) AS weeks_after_first_week
  FROM(
    SELECT
      *,
      MIN(event_week) OVER(PARTITION BY user_pseudo_id) AS first_week
    FROM base
  )
), visit_cnt_data AS(
  #active_users, cohort_users 추출
  SELECT
    *,
    FIRST_VALUE(active_users) OVER(PARTITION BY first_week ORDER BY weeks_after_first_week) AS cohort_users
  FROM(
    SELECT
      first_week,
      weeks_after_first_week,
      COUNT(DISTINCT user_pseudo_id) AS active_users,
    FROM week_diff_data
    GROUP BY ALL
  )
)

#retention_rate 추출
SELECT
  *,
  ROUND(SAFE_DIVIDE(active_users, cohort_users), 2) AS retention_rate
FROM visit_cnt_data
ORDER BY first_week, weeks_after_first_week

image.png

image.png

리텐션 분석 결과

(방문 주차 기준 / 붉은색으로 갈수록 낮은 값, 초록색으로 갈수록 높은 값을 의미)

https://docs.google.com/spreadsheets/d/1YXni_sBkk79UPQFc3LL7vcHBk3CbN7mUx3CQvGJLMjU/edit?usp=sharing