결과 예상해보기

diff_of_week | user_cnt | first_week_user_cnt | retention_rate

쿼리

WITH base AS (
  SELECT
    DISTINCT
      user_id,
      user_pseudo_id,
      DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_date,
      DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime,
      event_name
  FROM advanced.app_logs
), first_week_and_diff AS (
  SELECT
    *,
    DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week
  FROM (
    SELECT
      DISTINCT
        user_pseudo_id,
        DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week,
        DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week
    FROM base
  )
), user_counts AS (
  SELECT
    diff_of_week,
    COUNT(DISTINCT user_pseudo_id) AS user_cnt
  FROM first_week_and_diff
  GROUP BY diff_of_week
)

SELECT
  *,
  ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt), 2) AS retention_rate
FROM (
  SELECT
    *,
    FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week) AS first_week_user_cnt
  FROM user_counts
)

쿼리 결과

diff_of_week user_cnt first_week_user_cnt retention_rate
0 52823 52823 1
1 4434 52823 0.08
2 4643 52823 0.09
3 4719 52823 0.09
4 4592 52823 0.09
5 4684 52823 0.09
6 4586 52823 0.09
7 4353 52823 0.08
8 4290 52823 0.08
9 4238 52823 0.08
10 3964 52823 0.08
11 3711 52823 0.07
12 3344 52823 0.06
13 3039 52823 0.06
14 2728 52823 0.05
15 2279 52823 0.04
16 1947 52823 0.04
17 1691 52823 0.03
18 1341 52823 0.03
19 1054 52823 0.02
20 827 52823 0.02
21 541 52823 0.01
22 355 52823 0.01
23 209 52823 0
24 98 52823 0

시각화

image.png

해석