그룹별 리텐션을 확인하는 두가지 방법이다.
-- 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가 적게 중첩되어있어 성능저하가 덜 발생함
- (-) 상대적으로 가독성이 떨어짐
- (-) 추가 분석 시, 확장이 어려움
[MySQL] 전환율 구하기 (0) | 2025.02.09 |
---|---|
SQL 사전 : 문자 함수 (0) | 2025.02.09 |