列表

详情


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%

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
# Write your MySQL query statement below

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;

上一题