imhamburger 님의 블로그

Leetcode - Analyze Subscription Conversion 문제풀이 본문

Mysql

Leetcode - Analyze Subscription Conversion 문제풀이

imhamburger 2025. 12. 28. 21:14

문제

https://leetcode.com/problems/analyze-subscription-conversion/description/

 

구독형 서비스에서 사용자 행동 패턴을 분석하려고 한다.

해당 서비스는 7일간의 무료 체험 기간을 제공하며, 이후 사용자는 유료 구독으로 전환하거나 취소할 수 있다.

다음 요구사항을 만족하는 해결책을 작성하시오.

  1. 무료 체험에서 유료 구독으로 전환한 사용자를 찾는다.
  2. 각 사용자의 무료 체험 기간 동안의 일 평균 활동 시간을 계산한다.
    • 소수점 둘째 자리까지 반올림한다.
  3. 각 사용자의 유료 구독 기간 동안의 일 평균 활동 시간을 계산한다.
    • 소수점 둘째 자리까지 반올림한다.
  4. 결과 테이블은 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을 이용했을 때가 훨씬 성능면에서 좋다!