1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-09-07 00:11:41 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
Files
leetcode-problemset/leetcode-cn/originData/analyze-subscription-conversion.json
2025-04-03 23:09:51 +08:00

107 lines
20 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"data": {
"question": {
"questionId": "3848",
"questionFrontendId": "3497",
"categoryTitle": "Database",
"boundTopicId": 3630936,
"title": "Analyze Subscription Conversion ",
"titleSlug": "analyze-subscription-conversion",
"content": "<p>Table: <code>UserActivity</code></p>\n\n<pre>\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 (&#39;free_trial&#39;, &#39;paid&#39;, &#39;cancelled&#39;).\nactivity_duration is the number of minutes the user spent on the platform that day.\nEach row represents a user&#39;s activity on a specific date.\n</pre>\n\n<p>A subscription service wants to analyze user behavior patterns. The company offers a <code>7</code>-day <strong>free trial</strong>, after which users can subscribe to a <strong>paid plan</strong> or <strong>cancel</strong>. Write a solution to:</p>\n\n<ol>\n\t<li>Find users who converted from free trial to paid subscription</li>\n\t<li>Calculate each user&#39;s <strong>average daily activity duration</strong> during their <strong>free trial</strong> period (rounded to <code>2</code> decimal places)</li>\n\t<li>Calculate each user&#39;s <strong>average daily activity duration</strong> during their <strong>paid</strong> subscription period (rounded to <code>2</code> decimal places)</li>\n</ol>\n\n<p>Return <em>the result table ordered by </em><code>user_id</code><em> in <strong>ascending</strong> order</em>.</p>\n\n<p>The result format is in the following example.</p>\n\n<p>&nbsp;</p>\n<p><strong class=\"example\">Example:</strong></p>\n\n<div class=\"example-block\">\n<p><strong>Input:</strong></p>\n\n<p>UserActivity table:</p>\n\n<pre class=\"example-io\">\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</pre>\n\n<p><strong>Output:</strong></p>\n\n<pre class=\"example-io\">\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</pre>\n\n<p><strong>Explanation:</strong></p>\n\n<ul>\n\t<li><strong>User 1:</strong>\n\n\t<ul>\n\t\t<li>Had 3 days of free trial with durations of 45, 30, and 60 minutes.</li>\n\t\t<li>Average trial duration: (45 + 30 + 60) / 3 = 45.00 minutes.</li>\n\t\t<li>Had 3 days of paid subscription with durations of 75, 90, and 65 minutes.</li>\n\t\t<li>Average paid duration: (75 + 90 + 65) / 3 = 76.67 minutes.</li>\n\t</ul>\n\t</li>\n\t<li><strong>User 2:</strong>\n\t<ul>\n\t\t<li>Had 3 days of free trial with durations of 55, 25, and 50 minutes.</li>\n\t\t<li>Average trial duration: (55 + 25 + 50) / 3 = 43.33 minutes.</li>\n\t\t<li>Did not convert to a paid subscription (only had free_trial and cancelled activities).</li>\n\t\t<li>Not included in the output because they didn&#39;t convert to paid.</li>\n\t</ul>\n\t</li>\n\t<li><strong>User 3:</strong>\n\t<ul>\n\t\t<li>Had 3 days of free trial with durations of 70, 60, and 80 minutes.</li>\n\t\t<li>Average trial duration: (70 + 60 + 80) / 3 = 70.00 minutes.</li>\n\t\t<li>Had 3 days of paid subscription with durations of 50, 55, and 85 minutes.</li>\n\t\t<li>Average paid duration: (50 + 55 + 85) / 3 = 63.33 minutes.</li>\n\t</ul>\n\t</li>\n\t<li><strong>User 4:</strong>\n\t<ul>\n\t\t<li>Had 2 days of free trial with durations of 40 and 35 minutes.</li>\n\t\t<li>Average trial duration: (40 + 35) / 2 = 37.50 minutes.</li>\n\t\t<li>Had 1 day of paid subscription with duration of 45 minutes before cancelling.</li>\n\t\t<li>Average paid duration: 45.00 minutes.</li>\n\t</ul>\n\t</li>\n</ul>\n\n<p>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.</p>\n</div>\n",
"translatedTitle": "分析订阅转化",
"translatedContent": "<p>表:<code>UserActivity</code></p>\n\n<pre>\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</pre>\n\n<p>订阅服务想要分析用户行为模式。公司提供7天免费试用试用结束后用户可以选择订阅 <strong>付费计划</strong> 或 <strong>取消</strong>。编写解决方案:</p>\n\n<ol>\n\t<li>查找从免费试用转为付费订阅的用户</li>\n\t<li>计算每位用户在 <strong>免费试用</strong> 期间的 <strong>平均每日活动时长</strong>(四舍五入至小数点后 <code>2</code> 位)</li>\n\t<li>计算每位用户在 <strong>付费</strong> 订阅期间的 <strong>平均每日活动时长</strong>(四舍五入到小数点后&nbsp;<code>2</code> 位)</li>\n</ol>\n\n<p>返回结果表以<em>&nbsp;</em><code>user_id</code><em> </em><strong>升序&nbsp;</strong>排序。</p>\n\n<p>结果格式如下所示。</p>\n\n<p>&nbsp;</p>\n\n<p><strong class=\"example\">示例:</strong></p>\n\n<div class=\"example-block\">\n<p><strong>输入:</strong></p>\n\n<p>UserActivity 表:</p>\n\n<pre class=\"example-io\">\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</pre>\n\n<p><strong>输出:</strong></p>\n\n<pre class=\"example-io\">\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</pre>\n\n<p><strong>解释:</strong></p>\n\n<ul>\n\t<li><strong>用户 1:</strong>\n\n\t<ul>\n\t\t<li>体验了 3 天免费试用,时长分别为 4530 和 60 分钟。</li>\n\t\t<li>平均试用时长:(45 + 30 + 60) / 3 = 45.00 分钟。</li>\n\t\t<li>拥有 3 天付费订阅,时长分别为 7590 和 65分钟。</li>\n\t\t<li>平均花费市场:(75 + 90 + 65) / 3 = 76.67 分钟。</li>\n\t</ul>\n\t</li>\n\t<li><strong>用户 2:</strong>\n\t<ul>\n\t\t<li>体验了 3 天免费试用,时长分别为 5525 和 50 分钟。</li>\n\t\t<li>平均试用时长:(55 + 25 + 50) / 3 = 43.33 分钟。</li>\n\t\t<li>没有转为付费订阅(只有&nbsp;free_trial 和 cancelled 活动)。</li>\n\t\t<li>未包含在输出中,因为他未转换为付费用户。</li>\n\t</ul>\n\t</li>\n\t<li><strong>用户 3:</strong>\n\t<ul>\n\t\t<li>体验了 3 天免费试用,时长分别为 7060 和 80 分钟。</li>\n\t\t<li>平均试用时长:(70 + 60 + 80) / 3 = 70.00 分钟。</li>\n\t\t<li>拥有 3 天付费订阅,时长分别为 5055 和 85 分钟。</li>\n\t\t<li>平均花费时长:(50 + 55 + 85) / 3 = 63.33 分钟。</li>\n\t</ul>\n\t</li>\n\t<li><strong>用户 4:</strong>\n\t<ul>\n\t\t<li>体验了 2 天免费试用,时长分别为 40 和 35 分钟。</li>\n\t\t<li>平均试用时长:(40 + 35) / 2 = 37.50 分钟。</li>\n\t\t<li>在取消前有 1 天的付费订阅时长为45分钟。</li>\n\t\t<li>平均花费时长45.00 分钟。</li>\n\t</ul>\n\t</li>\n</ul>\n\n<p>结果表仅包括从免费试用转为付费订阅的用户(用户 13 和 4并且以&nbsp;user_id 升序排序。</p>\n</div>\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\",\"<p>\\u7248\\u672c\\uff1a<code>MySQL 8.0<\\/code><\\/p>\"],\"mssql\":[\"MS SQL Server\",\"<p>mssql server 2019.<\\/p>\"],\"oraclesql\":[\"Oracle\",\"<p>Oracle Sql 11.2.<\\/p>\"],\"pythondata\":[\"Pandas\",\"<p>Python 3.10 with Pandas 2.2.2 and NumPy 1.26.4<\\/p>\"],\"postgresql\":[\"PostgreSQL\",\"<p>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"
}
}
}