傳送門: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 和他們注冊的賽事。
編寫解決方案統計出各賽事的用戶注冊百分率,保留兩位小數。
返回的結果表按 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%
解析
統計每個賽事,就是按賽事id分組,所以user_id不作為分組字段,無需考慮左連接,用內連接即可。連接完后,按賽事id分組,注冊率就是組內user_id的出現頻率,即組內用戶數量/用戶總數,用戶總數用子查詢即可,注意這里用的是百分比,所以要*100。最后別忘記排序,percentage在前,contest_id在后。
代碼(標準SQL)
select contest_id,
round(count(*)/(select count(*)from Users)*100,2) as percentage
from Users u
join Register r
on u.user_id=r.user_id
group by contest_id
order by percentage desc,contest_id;