{ "data": { "question": { "questionId": "3848", "questionFrontendId": "3497", "categoryTitle": "Database", "boundTopicId": 3630936, "title": "Analyze Subscription Conversion ", "titleSlug": "analyze-subscription-conversion", "content": "

Table: UserActivity

\n\n
\n+------------------+---------+\n| Column Name      | Type    | \n+------------------+---------+\n| user_id          | int     |\n| activity_date    | date    |\n| activity_type    | varchar |\n| activity_duration| int     |\n+------------------+---------+\n(user_id, activity_date, activity_type) is the unique key for this table.\nactivity_type is one of ('free_trial', 'paid', 'cancelled').\nactivity_duration is the number of minutes the user spent on the platform that day.\nEach row represents a user's activity on a specific date.\n
\n\n

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. Write a solution to:

\n\n
    \n\t
  1. Find users who converted from free trial to paid subscription
  2. \n\t
  3. Calculate each user's average daily activity duration during their free trial period (rounded to 2 decimal places)
  4. \n\t
  5. Calculate each user's average daily activity duration during their paid subscription period (rounded to 2 decimal places)
  6. \n
\n\n

Return the result table ordered by user_id in ascending order.

\n\n

The result format is in the following example.

\n\n

 

\n

Example:

\n\n
\n

Input:

\n\n

UserActivity table:

\n\n
\n+---------+---------------+---------------+-------------------+\n| user_id | activity_date | activity_type | activity_duration |\n+---------+---------------+---------------+-------------------+\n| 1       | 2023-01-01    | free_trial    | 45                |\n| 1       | 2023-01-02    | free_trial    | 30                |\n| 1       | 2023-01-05    | free_trial    | 60                |\n| 1       | 2023-01-10    | paid          | 75                |\n| 1       | 2023-01-12    | paid          | 90                |\n| 1       | 2023-01-15    | paid          | 65                |\n| 2       | 2023-02-01    | free_trial    | 55                |\n| 2       | 2023-02-03    | free_trial    | 25                |\n| 2       | 2023-02-07    | free_trial    | 50                |\n| 2       | 2023-02-10    | cancelled     | 0                 |\n| 3       | 2023-03-05    | free_trial    | 70                |\n| 3       | 2023-03-06    | free_trial    | 60                |\n| 3       | 2023-03-08    | free_trial    | 80                |\n| 3       | 2023-03-12    | paid          | 50                |\n| 3       | 2023-03-15    | paid          | 55                |\n| 3       | 2023-03-20    | paid          | 85                |\n| 4       | 2023-04-01    | free_trial    | 40                |\n| 4       | 2023-04-03    | free_trial    | 35                |\n| 4       | 2023-04-05    | paid          | 45                |\n| 4       | 2023-04-07    | cancelled     | 0                 |\n+---------+---------------+---------------+-------------------+\n
\n\n

Output:

\n\n
\n+---------+--------------------+-------------------+\n| user_id | trial_avg_duration | paid_avg_duration |\n+---------+--------------------+-------------------+\n| 1       | 45.00              | 76.67             |\n| 3       | 70.00              | 63.33             |\n| 4       | 37.50              | 45.00             |\n+---------+--------------------+-------------------+\n
\n\n

Explanation:

\n\n\n\n

The result table only includes users who converted from free trial to paid subscription (users 1, 3, and 4), and is ordered by user_id in ascending order.

\n
\n", "translatedTitle": "分析订阅转化", "translatedContent": "

表:UserActivity

\n\n
\n+------------------+---------+\n| Column Name      | Type    | \n+------------------+---------+\n| user_id          | int     |\n| activity_date    | date    |\n| activity_type    | varchar |\n| activity_duration| int     |\n+------------------+---------+\n(user_id, activity_date, activity_type) 是这张表的唯一主键。\nactivity_type 是('free_trial', 'paid', 'cancelled')中的一个。\nactivity_duration 是用户当天在平台上花费的分钟数。\n每一行表示一个用户在特定日期的活动。\n
\n\n

订阅服务想要分析用户行为模式。公司提供7天免费试用,试用结束后,用户可以选择订阅 付费计划取消。编写解决方案:

\n\n
    \n\t
  1. 查找从免费试用转为付费订阅的用户
  2. \n\t
  3. 计算每位用户在 免费试用 期间的 平均每日活动时长(四舍五入至小数点后 2 位)
  4. \n\t
  5. 计算每位用户在 付费 订阅期间的 平均每日活动时长(四舍五入到小数点后 2 位)
  6. \n
\n\n

返回结果表以 user_id 升序 排序。

\n\n

结果格式如下所示。

\n\n

 

\n\n

示例:

\n\n
\n

输入:

\n\n

UserActivity 表:

\n\n
\n+---------+---------------+---------------+-------------------+\n| user_id | activity_date | activity_type | activity_duration |\n+---------+---------------+---------------+-------------------+\n| 1       | 2023-01-01    | free_trial    | 45                |\n| 1       | 2023-01-02    | free_trial    | 30                |\n| 1       | 2023-01-05    | free_trial    | 60                |\n| 1       | 2023-01-10    | paid          | 75                |\n| 1       | 2023-01-12    | paid          | 90                |\n| 1       | 2023-01-15    | paid          | 65                |\n| 2       | 2023-02-01    | free_trial    | 55                |\n| 2       | 2023-02-03    | free_trial    | 25                |\n| 2       | 2023-02-07    | free_trial    | 50                |\n| 2       | 2023-02-10    | cancelled     | 0                 |\n| 3       | 2023-03-05    | free_trial    | 70                |\n| 3       | 2023-03-06    | free_trial    | 60                |\n| 3       | 2023-03-08    | free_trial    | 80                |\n| 3       | 2023-03-12    | paid          | 50                |\n| 3       | 2023-03-15    | paid          | 55                |\n| 3       | 2023-03-20    | paid          | 85                |\n| 4       | 2023-04-01    | free_trial    | 40                |\n| 4       | 2023-04-03    | free_trial    | 35                |\n| 4       | 2023-04-05    | paid          | 45                |\n| 4       | 2023-04-07    | cancelled     | 0                 |\n+---------+---------------+---------------+-------------------+\n
\n\n

输出:

\n\n
\n+---------+--------------------+-------------------+\n| user_id | trial_avg_duration | paid_avg_duration |\n+---------+--------------------+-------------------+\n| 1       | 45.00              | 76.67             |\n| 3       | 70.00              | 63.33             |\n| 4       | 37.50              | 45.00             |\n+---------+--------------------+-------------------+\n
\n\n

解释:

\n\n\n\n

结果表仅包括从免费试用转为付费订阅的用户(用户 1,3 和 4),并且以 user_id 升序排序。

\n
\n", "isPaidOnly": false, "difficulty": "Medium", "likes": 0, "dislikes": 0, "isLiked": null, "similarQuestions": "[]", "contributors": [], "langToValidPlayground": "{\"cpp\": false, \"java\": false, \"python\": false, \"python3\": false, \"mysql\": false, \"mssql\": false, \"oraclesql\": false, \"c\": false, \"csharp\": false, \"javascript\": false, \"typescript\": false, \"bash\": false, \"php\": false, \"swift\": false, \"kotlin\": false, \"dart\": false, \"golang\": false, \"ruby\": false, \"scala\": false, \"html\": false, \"pythonml\": false, \"rust\": false, \"racket\": false, \"erlang\": false, \"elixir\": false, \"pythondata\": false, \"react\": false, \"vanillajs\": false, \"postgresql\": false, \"cangjie\": false}", "topicTags": [ { "name": "Database", "slug": "database", "translatedName": "数据库", "__typename": "TopicTagNode" } ], "companyTagStats": null, "codeSnippets": [ { "lang": "MySQL", "langSlug": "mysql", "code": "# Write your MySQL query statement below", "__typename": "CodeSnippetNode" }, { "lang": "MS SQL Server", "langSlug": "mssql", "code": "/* Write your T-SQL query statement below */", "__typename": "CodeSnippetNode" }, { "lang": "Oracle", "langSlug": "oraclesql", "code": "/* Write your PL/SQL query statement below */", "__typename": "CodeSnippetNode" }, { "lang": "Pandas", "langSlug": "pythondata", "code": "import pandas as pd\n\ndef analyze_subscription_conversion(user_activity: pd.DataFrame) -> pd.DataFrame:\n ", "__typename": "CodeSnippetNode" }, { "lang": "PostgreSQL", "langSlug": "postgresql", "code": "-- Write your PostgreSQL query statement below", "__typename": "CodeSnippetNode" } ], "stats": "{\"totalAccepted\": \"181\", \"totalSubmission\": \"216\", \"totalAcceptedRaw\": 181, \"totalSubmissionRaw\": 216, \"acRate\": \"83.8%\"}", "hints": [], "solution": null, "status": null, "sampleTestCase": "{\"headers\":{\"UserActivity\":[\"user_id\",\"activity_date\",\"activity_type\",\"activity_duration\"]},\"rows\":{\"UserActivity\":[[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],[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]]}}", "metaData": "{\"mysql\":[\"CREATE TABLE if not exists UserActivity (\\n user_id INT,\\n activity_date DATE,\\n activity_type VARCHAR(20),\\n activity_duration INT\\n)\"],\"mssql\":[\"CREATE TABLE UserActivity (\\n user_id INT,\\n activity_date DATE,\\n activity_type VARCHAR(20),\\n activity_duration INT\\n)\"],\"oraclesql\":[\"CREATE TABLE UserActivity (\\n user_id NUMBER,\\n activity_date DATE,\\n activity_type VARCHAR2(20),\\n activity_duration NUMBER\\n)\",\"ALTER SESSION SET nls_date_format='YYYY-MM-DD'\"],\"database\":true,\"name\":\"analyze_subscription_conversion\",\"postgresql\":[\"CREATE TABLE IF NOT EXISTS UserActivity (\\n user_id INTEGER,\\n activity_date DATE,\\n activity_type VARCHAR(20),\\n activity_duration INTEGER\\n);\\n\"],\"pythondata\":[\"UserActivity = pd.DataFrame({\\n 'user_id': pd.Series(dtype='int'),\\n 'activity_date': pd.Series(dtype='datetime64[ns]'),\\n 'activity_type': pd.Series(dtype='str'),\\n 'activity_duration': pd.Series(dtype='int')\\n})\"],\"database_schema\":{\"UserActivity\":{\"user_id\":\"INT\",\"activity_date\":\"DATE\",\"activity_type\":\"VARCHAR(20)\",\"activity_duration\":\"INT\"}}}", "judgerAvailable": true, "judgeType": "large", "mysqlSchemas": [ "CREATE TABLE if not exists UserActivity (\n user_id INT,\n activity_date DATE,\n activity_type VARCHAR(20),\n activity_duration INT\n)", "Truncate table UserActivity", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('1', '2023-01-01', 'free_trial', '45')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('1', '2023-01-02', 'free_trial', '30')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('1', '2023-01-05', 'free_trial', '60')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('1', '2023-01-10', 'paid', '75')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('1', '2023-01-12', 'paid', '90')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('1', '2023-01-15', 'paid', '65')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('2', '2023-02-01', 'free_trial', '55')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('2', '2023-02-03', 'free_trial', '25')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('2', '2023-02-07', 'free_trial', '50')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('2', '2023-02-10', 'cancelled', '0')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('3', '2023-03-05', 'free_trial', '70')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('3', '2023-03-06', 'free_trial', '60')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('3', '2023-03-08', 'free_trial', '80')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('3', '2023-03-12', 'paid', '50')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('3', '2023-03-15', 'paid', '55')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('3', '2023-03-20', 'paid', '85')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('4', '2023-04-01', 'free_trial', '40')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('4', '2023-04-03', 'free_trial', '35')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('4', '2023-04-05', 'paid', '45')", "insert into UserActivity (user_id, activity_date, activity_type, activity_duration) values ('4', '2023-04-07', 'cancelled', '0')" ], "enableRunCode": true, "envInfo": "{\"mysql\":[\"MySQL\",\"

\\u7248\\u672c\\uff1aMySQL 8.0<\\/code><\\/p>\"],\"mssql\":[\"MS SQL Server\",\"

mssql server 2019.<\\/p>\"],\"oraclesql\":[\"Oracle\",\"

Oracle Sql 11.2.<\\/p>\"],\"pythondata\":[\"Pandas\",\"

Python 3.10 with Pandas 2.2.2 and NumPy 1.26.4<\\/p>\"],\"postgresql\":[\"PostgreSQL\",\"

PostgreSQL 16<\\/p>\"]}", "book": null, "isSubscribed": false, "isDailyQuestion": false, "dailyRecordStatus": null, "editorType": "CKEDITOR", "ugcQuestionId": null, "style": "LEETCODE", "exampleTestcases": "{\"headers\":{\"UserActivity\":[\"user_id\",\"activity_date\",\"activity_type\",\"activity_duration\"]},\"rows\":{\"UserActivity\":[[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],[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]]}}", "__typename": "QuestionNode" } } }