Analyze Subscription Conversion - Problem

A subscription service wants to analyze user behavior patterns. The company offers a 7-day free trial, after which users can subscribe to a paid plan or cancel.

Table: UserActivity

Column NameType
user_idint
activity_datedate
activity_typevarchar
activity_durationint

(user_id, activity_date, activity_type) is the unique key for this table.

activity_type is one of ('free_trial', 'paid', 'cancelled').

activity_duration is the number of minutes the user spent on the platform that day.

Write a solution to:

  • Find users who converted from free trial to paid subscription
  • Calculate each user's average daily activity duration during their free trial period (rounded to 2 decimal places)
  • Calculate each user's average daily activity duration during their paid subscription period (rounded to 2 decimal places)
  • Return the result table ordered by user_id in ascending order

Table Schema

UserActivity
Column Name Type Description
user_id PK int User identifier
activity_date PK date Date of the activity
activity_type PK varchar Type of activity: 'free_trial', 'paid', or 'cancelled'
activity_duration int Number of minutes the user spent on the platform that day
Primary Key: (user_id, activity_date, activity_type)
Note: Each row represents a user's activity on a specific date. Users can have free_trial, paid, or cancelled activity types.

Input & Output

Example 1 — Multiple Users with Different Conversion Patterns
Input Table:
user_id activity_date activity_type activity_duration
1 2023-01-01 free_trial 45
1 2023-01-02 free_trial 30
1 2023-01-05 free_trial 60
1 2023-01-10 paid 75
1 2023-01-12 paid 90
1 2023-01-15 paid 65
2 2023-02-01 free_trial 55
2 2023-02-03 free_trial 25
2 2023-02-07 free_trial 50
2 2023-02-10 cancelled 0
3 2023-03-05 free_trial 70
3 2023-03-06 free_trial 60
3 2023-03-08 free_trial 80
3 2023-03-12 paid 50
3 2023-03-15 paid 55
3 2023-03-20 paid 85
Output:
user_id trial_avg_duration paid_avg_duration
1 45 76.67
3 70 63.33
💡 Note:

User 1: Had 3 free trial days (45, 30, 60 minutes) averaging 45.00, and 3 paid days (75, 90, 65 minutes) averaging 76.67.

User 2: Had free trial but cancelled instead of converting to paid, so excluded from results.

User 3: Had 3 free trial days (70, 60, 80 minutes) averaging 70.00, and 3 paid days (50, 55, 85 minutes) averaging 63.33.

Example 2 — User with Short Paid Period
Input Table:
user_id activity_date activity_type activity_duration
4 2023-04-01 free_trial 40
4 2023-04-03 free_trial 35
4 2023-04-05 paid 45
4 2023-04-07 cancelled 0
Output:
user_id trial_avg_duration paid_avg_duration
4 37.5 45
💡 Note:

User 4: Had 2 free trial days (40, 35 minutes) averaging 37.50, had 1 paid day (45 minutes) before cancelling. Since they had both free_trial and paid activities, they are included in results.

Constraints

  • 1 ≤ user_id ≤ 10^5
  • activity_type is one of ('free_trial', 'paid', 'cancelled')
  • 0 ≤ activity_duration ≤ 1440 (max minutes in a day)
  • Each (user_id, activity_date, activity_type) combination is unique

Visualization

Tap to expand
Subscription Conversion Analysis OverviewInput: UserActivityuser_idtypeduration1free_trial451paid752free_trial552cancelled0Step 1: IdentifyConverted Users(Both free_trialand paid)GROUP BYAVG + CASEOutput: Conversion Analysisuser_idtrial_avgpaid_avg145.0076.67User 2: Excluded (no paid conversion)🎯 Key Steps:1. CTE: Find users with both activity types2. Conditional AVG: Separate calculations by type3. ROUND: Format results to 2 decimal places
Understanding the Visualization
1
Input
User activities with different types
2
Filter
Find users with both free_trial and paid
3
Aggregate
Calculate conditional averages by activity type
Key Takeaway
🎯 Key Insight: Use CTE to identify converted users first, then apply conditional aggregation to calculate separate averages for different activity types
Asked in
Netflix 12 Spotify 8 Adobe 6
23.4K Views
Medium Frequency
~12 min Avg. Time
892 Likes
Ln 1, Col 1
Smart Actions
💡 Explanation
AI Ready
💡 Suggestion Tab to accept Esc to dismiss
// Output will appear here after running code
Code Editor Closed
Click the red button to reopen