{ "data": { "question": { "questionId": "4103", "questionFrontendId": "3716", "categoryTitle": "Database", "boundTopicId": 3805185, "title": "Find Churn Risk Customers", "titleSlug": "find-churn-risk-customers", "content": "
Table: subscription_events
\n+------------------+---------+\n| Column Name | Type | \n+------------------+---------+\n| event_id | int |\n| user_id | int |\n| event_date | date |\n| event_type | varchar |\n| plan_name | varchar |\n| monthly_amount | decimal |\n+------------------+---------+\nevent_id is the unique identifier for this table.\nevent_type can be start, upgrade, downgrade, or cancel.\nplan_name can be basic, standard, premium, or NULL (when event_type is cancel).\nmonthly_amount represents the monthly subscription cost after this event.\nFor cancel events, monthly_amount is 0.\n\n\n
Write a solution to Find Churn Risk Customers - users who show warning signs before churning. A user is considered churn risk customer if they meet ALL the following criteria:
\n\n50% of their historical maximum plan revenue.60 days.Return the result table ordered by days_as_subscriber in descending order, then by user_id in ascending order.
The result format is in the following example.
\n\n\n
Example:
\n\nInput:
\n\nsubscription_events table:
\n\n\n+----------+---------+------------+------------+-----------+----------------+\n| event_id | user_id | event_date | event_type | plan_name | monthly_amount |\n+----------+---------+------------+------------+-----------+----------------+\n| 1 | 501 | 2024-01-01 | start | premium | 29.99 |\n| 2 | 501 | 2024-02-15 | downgrade | standard | 19.99 |\n| 3 | 501 | 2024-03-20 | downgrade | basic | 9.99 |\n| 4 | 502 | 2024-01-05 | start | standard | 19.99 |\n| 5 | 502 | 2024-02-10 | upgrade | premium | 29.99 |\n| 6 | 502 | 2024-03-15 | downgrade | basic | 9.99 |\n| 7 | 503 | 2024-01-10 | start | basic | 9.99 |\n| 8 | 503 | 2024-02-20 | upgrade | standard | 19.99 |\n| 9 | 503 | 2024-03-25 | upgrade | premium | 29.99 |\n| 10 | 504 | 2024-01-15 | start | premium | 29.99 |\n| 11 | 504 | 2024-03-01 | downgrade | standard | 19.99 |\n| 12 | 504 | 2024-03-30 | cancel | NULL | 0.00 |\n| 13 | 505 | 2024-02-01 | start | basic | 9.99 |\n| 14 | 505 | 2024-02-28 | upgrade | standard | 19.99 |\n| 15 | 506 | 2024-01-20 | start | premium | 29.99 |\n| 16 | 506 | 2024-03-10 | downgrade | basic | 9.99 |\n+----------+---------+------------+------------+-----------+----------------+\n\n\n
Output:
\n\n\n+----------+--------------+------------------------+-----------------------+--------------------+\n| user_id | current_plan | current_monthly_amount | max_historical_amount | days_as_subscriber |\n+----------+--------------+------------------------+-----------------------+--------------------+\n| 501 | basic | 9.99 | 29.99 | 79 |\n| 502 | basic | 9.99 | 29.99 | 69 |\n+----------+--------------+------------------------+-----------------------+--------------------+\n\n\n
Explanation:
\n\nResult table is ordered by days_as_subscriber DESC, then user_id ASC.
\n\nNote: days_as_subscriber is calculated from the first event date to the last event date for each user.
\n表:subscription_events
\n+------------------+---------+\n| Column Name | Type | \n+------------------+---------+\n| event_id | int |\n| user_id | int |\n| event_date | date |\n| event_type | varchar |\n| plan_name | varchar |\n| monthly_amount | decimal |\n+------------------+---------+\nevent_id 是这张表的唯一主键。\nevent_type 可以是 start,upgrade,downgrade 或 cancel。\nplan_name 可以是 basic,standard,premium 或 NULL(当 event_type 是 cancel)。\nmonthly_amount 表示此次事件后的月度订阅费用。\n对于 cancel 的事件,monthly_amount 为 0。\n\n\n
编写一个解决方案来 寻找流失风险用户 - 出现预流失信号的用户。如果用户符合以下所有条件,则被视为 有流失风险 的客户:
\n\n50%。60 天。返回结果表按 days_as_subscriber 降序 排序,然后按 user_id 升序 排序。
结果格式如下所示。
\n\n\n\n
示例:
\n\n输入:
\n\nsubscription_events 表:
\n\n\n+----------+---------+------------+------------+-----------+----------------+\n| event_id | user_id | event_date | event_type | plan_name | monthly_amount |\n+----------+---------+------------+------------+-----------+----------------+\n| 1 | 501 | 2024-01-01 | start | premium | 29.99 |\n| 2 | 501 | 2024-02-15 | downgrade | standard | 19.99 |\n| 3 | 501 | 2024-03-20 | downgrade | basic | 9.99 |\n| 4 | 502 | 2024-01-05 | start | standard | 19.99 |\n| 5 | 502 | 2024-02-10 | upgrade | premium | 29.99 |\n| 6 | 502 | 2024-03-15 | downgrade | basic | 9.99 |\n| 7 | 503 | 2024-01-10 | start | basic | 9.99 |\n| 8 | 503 | 2024-02-20 | upgrade | standard | 19.99 |\n| 9 | 503 | 2024-03-25 | upgrade | premium | 29.99 |\n| 10 | 504 | 2024-01-15 | start | premium | 29.99 |\n| 11 | 504 | 2024-03-01 | downgrade | standard | 19.99 |\n| 12 | 504 | 2024-03-30 | cancel | NULL | 0.00 |\n| 13 | 505 | 2024-02-01 | start | basic | 9.99 |\n| 14 | 505 | 2024-02-28 | upgrade | standard | 19.99 |\n| 15 | 506 | 2024-01-20 | start | premium | 29.99 |\n| 16 | 506 | 2024-03-10 | downgrade | basic | 9.99 |\n+----------+---------+------------+------------+-----------+----------------+\n\n\n
输出:
\n\n\n+----------+--------------+------------------------+-----------------------+--------------------+\n| user_id | current_plan | current_monthly_amount | max_historical_amount | days_as_subscriber |\n+----------+--------------+------------------------+-----------------------+--------------------+\n| 501 | basic | 9.99 | 29.99 | 79 |\n| 502 | basic | 9.99 | 29.99 | 69 |\n+----------+--------------+------------------------+-----------------------+--------------------+\n\n\n
解释:
\n\n结果表按 days_as_subscriber 降序排序,然后按 user_id 升序排序。
\n\n注意:days_as_subscriber 按照每个用户的第一个事件日期到最后一个事件日期进行计算。
\n\\u7248\\u672c\\uff1a 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\":{\"subscription_events\":[\"event_id\",\"user_id\",\"event_date\",\"event_type\",\"plan_name\",\"monthly_amount\"]},\"rows\":{\"subscription_events\":[[1,501,\"2024-01-01\",\"start\",\"premium\",29.99],[2,501,\"2024-02-15\",\"downgrade\",\"standard\",19.99],[3,501,\"2024-03-20\",\"downgrade\",\"basic\",9.99],[4,502,\"2024-01-05\",\"start\",\"standard\",19.99],[5,502,\"2024-02-10\",\"upgrade\",\"premium\",29.99],[6,502,\"2024-03-15\",\"downgrade\",\"basic\",9.99],[7,503,\"2024-01-10\",\"start\",\"basic\",9.99],[8,503,\"2024-02-20\",\"upgrade\",\"standard\",19.99],[9,503,\"2024-03-25\",\"upgrade\",\"premium\",29.99],[10,504,\"2024-01-15\",\"start\",\"premium\",29.99],[11,504,\"2024-03-01\",\"downgrade\",\"standard\",19.99],[12,504,\"2024-03-30\",\"cancel\",null,0.00],[13,505,\"2024-02-01\",\"start\",\"basic\",9.99],[14,505,\"2024-02-28\",\"upgrade\",\"standard\",19.99],[15,506,\"2024-01-20\",\"start\",\"premium\",29.99],[16,506,\"2024-03-10\",\"downgrade\",\"basic\",9.99]]}}",
"__typename": "QuestionNode"
}
}
}MySQL 8.0<\\/code><\\/p>\"],\"mssql\":[\"MS SQL Server\",\"