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 |
