essay
hot50-各赛事的用户注册率
#mysql
hot50——各赛事的用户注册率
用户表: 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 和他们注册的赛事。
编写解决方案统计出各赛事的用户注册百分率,保留两位小数。
返回的结果表按 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%
答:
select r.contest_id, round(count(r.user_id)*100/(select count(*) from Users), 2) as percentage from Users as u
join Register as r
on u.user_id = r.user_id
group by r.contest_id
order by percentage desc, r.contest_id asc解析:
- 确定数据源:我们需要统计每个赛事的注册人数,这主要依赖 Register 表。同时,我们需要知道总共有多少用户(分母),这需要用到 Users 表。
- 计算分母(总人数):Users 表中的总行数就是总用户数。可以使用
子查询 (SELECT COUNT(*) FROM Users)获取。 - 计算分子(各赛事注册人数):在 Register 表中,按 contest_id 分组,统计每组的 user_id 数量。
- 计算百分比:公式为 (注册人数 / 总人数) * 100。
- 排序:先按百分比
降序 (DESC),再按赛事ID升序 (ASC)。