상세 컨텐츠

본문 제목

[MySQL] 리텐션 확인

테크/SQL

by 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가 적게 중첩되어있어 성능저하가 덜 발생함
  • (-) 상대적으로 가독성이 떨어짐
  • (-) 추가 분석 시, 확장이 어려움

'테크 > SQL' 카테고리의 다른 글

[MySQL] 전환율 구하기  (0) 2025.02.09
SQL 사전 : 문자 함수  (0) 2025.02.09

관련글 더보기