mirror of
https://gitee.com/coder-xiaomo/leetcode-problemset
synced 2025-09-06 07:51:41 +08:00
107 lines
20 KiB
JSON
107 lines
20 KiB
JSON
{
|
||
"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 ('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</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'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'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> </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'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>(四舍五入到小数点后 <code>2</code> 位)</li>\n</ol>\n\n<p>返回结果表以<em> </em><code>user_id</code><em> </em><strong>升序 </strong>排序。</p>\n\n<p>结果格式如下所示。</p>\n\n<p> </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 天免费试用,时长分别为 45,30 和 60 分钟。</li>\n\t\t<li>平均试用时长:(45 + 30 + 60) / 3 = 45.00 分钟。</li>\n\t\t<li>拥有 3 天付费订阅,时长分别为 75,90 和 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 天免费试用,时长分别为 55,25 和 50 分钟。</li>\n\t\t<li>平均试用时长:(55 + 25 + 50) / 3 = 43.33 分钟。</li>\n\t\t<li>没有转为付费订阅(只有 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 天免费试用,时长分别为 70,60 和 80 分钟。</li>\n\t\t<li>平均试用时长:(70 + 60 + 80) / 3 = 70.00 分钟。</li>\n\t\t<li>拥有 3 天付费订阅,时长分别为 50,55 和 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>结果表仅包括从免费试用转为付费订阅的用户(用户 1,3 和 4),并且以 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"
|
||
}
|
||
}
|
||
} |