# Write your MySQL query statement below
1633. 各赛事的用户注册率
用户表: Users
+-------------+---------+ | Column Name | Type | +-------------+---------+ | user_id | int | | user_name | varchar | +-------------+---------+ user_id 是该表的主键。 该表中的每行包括用户 ID 和用户名。
注册表: Register
+-------------+---------+ | Column Name | Type | +-------------+---------+ | contest_id | int | | user_id | int | +-------------+---------+ (contest_id, user_id) 是该表的主键。 该表中的每行包含用户的 ID 和他们注册的赛事。
写一条 SQL 语句,查询各赛事的用户注册百分率,保留两位小数。
返回的结果表按 percentage
的 降序 排序,若相同则按 contest_id
的 升序 排序。
查询结果如下示例所示。
示例 1:
输入: Users
表: +---------+-----------+ | user_id | user_name | +---------+-----------+ | 6 | Alice | | 2 | Bob | | 7 | Alex | +---------+-----------+Register
表: +------------+---------+ | contest_id | user_id | +------------+---------+ | 215 | 6 | | 209 | 2 | | 208 | 2 | | 210 | 6 | | 208 | 6 | | 209 | 7 | | 209 | 6 | | 215 | 7 | | 208 | 7 | | 210 | 2 | | 207 | 2 | | 210 | 7 | +------------+---------+ 输出: +------------+------------+ | contest_id | percentage | +------------+------------+ | 208 | 100.0 | | 209 | 100.0 | | 210 | 100.0 | | 215 | 66.67 | | 207 | 33.33 | +------------+------------+ 解释: 所有用户都注册了 208、209 和 210 赛事,因此这些赛事的注册率为 100% ,我们按 contest_id 的降序排序加入结果表中。 Alice 和 Alex 注册了 215 赛事,注册率为 ((2/3) * 100) = 66.67% Bob 注册了 207 赛事,注册率为 ((1/3) * 100) = 33.33%
原站题解
pythondata 解法, 执行用时: 418 ms, 内存消耗: 69.1 MB, 提交时间: 2024-05-27 11:13:02
''' 不难,对contest_id取分组然后除以Users总数即可 稍微取一个巧:不需要用count函数,而是直接调用Dataframe对象的shape[0]属性获得总行数 ''' import pandas as pd def users_percentage1(users: pd.DataFrame, register: pd.DataFrame) -> pd.DataFrame: registed_users = register['contest_id'].value_counts().reset_index() registed_users['count'] = registed_users['count'].apply(lambda x:x/users.shape[0]*100).round(2) return registed_users.rename(columns={'count': 'percentage'}).sort_values(by=['percentage', 'contest_id'], ascending=[False, True]) # 对注册表进行分组统计人数,除以users表中的人数*100即为注册率 def users_percentage(users: pd.DataFrame, register: pd.DataFrame) -> pd.DataFrame: # 根据contest_id进行分组,并计算注册率 # agg中对user_id列应用lambda函数 grouped = register.groupby('contest_id').agg({ 'user_id': lambda x: (x.count()/users['user_id'].count()*100).round(2) }).reset_index().rename(columns={'user_id': 'percentage'}) # 排序输出 return grouped.sort_values(by=['percentage','contest_id'], ascending=[False,True])
mysql 解法, 执行用时: 651 ms, 内存消耗: 0 B, 提交时间: 2023-04-02 11:37:59
# Write your MySQL query statement below select contest_id,round(count(user_id) / (select count(1) from Users) * 100, 2) as percentage from Register group by contest_id order by percentage desc,contest_id;
mysql 解法, 执行用时: 655 ms, 内存消耗: 0 B, 提交时间: 2023-04-02 11:37:34
# Write your MySQL query statement below select contest_id, round(100*count(user_id)/(select count(1) from users),2) as percentage from Register group by contest_id order by 2 desc, 1;