⚙️ Tech/DB

[MySQL] 리텐션 확인

fiftyline 2025. 2. 9. 14:48

 

그룹별 리텐션을 확인하는 두가지 방법

 

 

-- 쿼리 1
with event_first as (
	select user_id, `group`, event_date, min(event_date) over (partition by e.user_id) as first_event
	from abtest.events e
	left join abtest.users u using(user_id)
)
, user_retention as (
	select `group`, user_id, min(event_date) as next_event
	from event_first
	where event_date > first_event and event_date <= date_add(first_event, interval 7 day)
	group by user_id
)
, group_first as (
	select `group`, count(distinct user_id) as fist_event_count
	from event_first
	group by `group`
)
, group_retention as (
	select `group`, count(distinct user_id) as retention_count
	from user_retention 
	group by `group`
)
select `group`, retention_count/fist_event_count as retention_rate
from group_first
join group_retention using(`group`)

 

-- 쿼리 2
with user_first_event as (
	select user_id, `group`, min(event_date) as first_event
	from abtest.users u
	left join abtest.events e using(user_id)
	group by user_id
)
select `group`, count(distinct case when event_date > first_event then user_id else null end) 
				/ count(distinct case when event_date = first_event then user_id else null end) as retention_rate
from abtest.events e
left join user_first_event fe using(user_id)
group by `group`

 

 

 

쿼리 1.

  • (+) 가독성이 좋다. 여러 단계로 나누어져 있어 각 단계의 역할이 명확. 디버깅이나 수정이 상대적으로 용이함
  • (+) 추가적인 분석이 필요할 때 확장성이 좋음
  • (-) CTE가 많아 쿼리가 길고 복잡
  • (-) CTE가 중첩될 경우, 데이터셋이 크면 성능이 저하

 

쿼리 2.

  • (+) 단순하고 간결함
  • (+) 쿼리가 적고 CTE가 적게 중첩되어있어 성능저하가 덜 발생함
  • (-) 상대적으로 가독성이 떨어짐
  • (-) 추가 분석 시, 확장이 어려움