반응형
- Day 1 / Day 7 / Day 30 누적 리텐션
WITH first_event AS(
SELECT user_id, MIN(DATE(created_at)) AS first_date
FROM `bigquery-public-data.thelook_ecommerce.events`
WHERE event_type IN ('home', 'product', 'cart', 'purchase') AND user_id IS NOT NULL
GROUP BY user_id
)
, user_activity AS(
SELECT
e.user_id
, DATE_DIFF(DATE(e.created_at), f.first_date, DAY) AS days
FROM `bigquery-public-data.thelook_ecommerce.events` e
LEFT JOIN first_event f ON e.user_id = f.user_id
WHERE DATE_DIFF(DATE(e.created_at), f.first_date, DAY) BETWEEN 1 AND 30
)
SELECT
f.first_date
, COUNT(DISTINCT f.user_id) AS cohort_size
, ROUND(100 * COUNT(DISTINCT CASE WHEN ua.days = 1 THEN f.user_id END)/COUNT(DISTINCT f.user_id),2) AS day1_retention
, ROUND(100 * COUNT(DISTINCT CASE WHEN ua.days BETWEEN 1 AND 7 THEN f.user_id END)/COUNT(DISTINCT f.user_id),2) AS day7_retention
, ROUND(100 * COUNT(DISTINCT CASE WHEN ua.days BETWEEN 1 AND 30 THEN f.user_id END)/COUNT(DISTINCT f.user_id),2) AS day30_retention
FROM first_event f
LEFT JOIN user_activity ua ON f.user_id = ua.user_id
GROUP BY f.first_date
ORDER BY f.first_date;

반응형
'⚙️ Tech > SQL, DB' 카테고리의 다른 글
| [SQL/BigQuery] 첫구매 이후 N일 내 재구매 (0) | 2025.10.15 |
|---|---|
| [MySQL] 날짜함수 (변환, 연산, 추출) (0) | 2025.10.13 |
| [SQL/BigQuery] 코호트별 n주차 리텐션율 (0) | 2025.10.12 |
| [SQL/BigQuery] 코호트별 첫구매까지 걸린 평균 일수 (0) | 2025.10.11 |
| [SQL/BigQuery] 신규 vs 기존 유저의 구매 (0) | 2025.10.11 |