imhamburger 님의 블로그
Leetcode - Analyze Subscription Conversion 문제풀이 본문
문제
https://leetcode.com/problems/analyze-subscription-conversion/description/
구독형 서비스에서 사용자 행동 패턴을 분석하려고 한다.
해당 서비스는 7일간의 무료 체험 기간을 제공하며, 이후 사용자는 유료 구독으로 전환하거나 취소할 수 있다.
다음 요구사항을 만족하는 해결책을 작성하시오.
- 무료 체험에서 유료 구독으로 전환한 사용자를 찾는다.
- 각 사용자의 무료 체험 기간 동안의 일 평균 활동 시간을 계산한다.
- 소수점 둘째 자리까지 반올림한다.
- 각 사용자의 유료 구독 기간 동안의 일 평균 활동 시간을 계산한다.
- 소수점 둘째 자리까지 반올림한다.
- 결과 테이블은 user_id 기준 오름차순으로 정렬하여 반환한다.
문제풀이
SELECT *
FROM (
SELECT user_id,
ROUND(AVG(CASE WHEN activity_type = 'free_trial' THEN activity_duration END),2) AS trial_avg_duration,
ROUND(AVG(CASE WHEN activity_type = 'paid' THEN activity_duration END),2) AS paid_avg_duration
FROM UserActivity
GROUP BY user_id
ORDER BY 1
) a
WHERE a.trial_avg_duration IS NOT NULL
AND a.paid_avg_duration IS NOT NULL
1. CASE WHEN을 사용해 activity_type 별로 평균 duration을 계산.
2. 내부 쿼리 결과를 a라는 서브쿼리로 감싸 trial_avg_duration IS NOT NULL (무료 체험 활동이 최소 1회 이상 존재한 사용자) paid_avg_duration IS NOT NULL (유료 구독 활동이 최소 1회 이상 존재한 사용자) 을 동시에 만족하는 조건을 추가.
-> 무료 체험 후 유료로 전환한 사용자만 필터링
결과

다른풀이 - HAVING 이용
select user_id,
round(avg(case when activity_type = 'free_trial' then activity_duration end),2) as trial_avg_duration,
round(avg(case when activity_type = 'paid' then activity_duration end),2) as paid_avg_duration
from useractivity
group by 1
having user_id in (select distinct user_id from useractivity where activity_type='paid')
order by 1
결과

HAVING을 이용했을 때가 훨씬 성능면에서 좋다!
'Mysql' 카테고리의 다른 글
| Mysql - CONCAT과 GROUP_CONCAT (0) | 2026.01.14 |
|---|---|
| Leetcode - Seasonal Sales Analysis 문제풀이 (0) | 2025.12.26 |
| Leetcode - Trips and Users 문제풀이 (0) | 2025.12.14 |
| 해커랭크 - Weather Observation Station 20 문제풀이 (0) | 2025.12.03 |
| 해커랭크 - BST 문제 풀이 (0) | 2025.11.30 |