数据库-练习题
练习题
1. 力扣 1633. 各赛事的用户注册率 简单
用户表: Users
1 | +-------------+---------+ |
注册表: Register
1 | +-------------+---------+ |
编写解决方案统计出各赛事的用户注册百分率,保留两位小数。
返回的结果表按 percentage
的 降序 排序,若相同则按 contest_id
的 升序 排序。
返回结果如下示例所示。
示例 1:
1 | 输入: |
题解:
表结构很简单, 都是只有两个属性
计算每个
contest_id
对应的注册率 , 我们只需要查询出每个contest_id
对应的注册人数 , 有多少人 , 再除以Users
中的用户人数即可
1
2
3
4
5
6
7
8
9
10 SELECT
r.contest_id,
ROUND(COUNT(r.user_id)/(SELECT COUNT(*) FROM Users) * 100,2) as percentage
FROM
Register AS r
GROUP BY
r.contest_id
ORDER BY
percentage DESC,
contest_id ASC;应该还是挺好理解的 , 查询两个数据
contest_id
和percentage
, group by 按contest_id
分组 , 计算的每组user_id
数量 , 这样就可以计算出注册率 , 最后按要求排一下序
2. 力扣 1661. 每台机器的进程平均运行时间 简单
表: Activity
1 | +----------------+---------+ |
现在有一个工厂网站由几台机器运行,每台机器上运行着 相同数量的进程 。编写解决方案,计算每台机器各自完成一个进程任务的平均耗时。
完成一个进程任务的时间指进程的'end' 时间戳
减去 'start' 时间戳
。平均耗时通过计算每台机器上所有进程任务的总耗费时间除以机器上的总进程数量获得。
结果表必须包含machine_id(机器ID)
和对应的 average time(平均耗时) 别名 processing_time
,且四舍五入保留3位小数。
以 任意顺序 返回表。
具体参考例子如下。
示例 1:
1 | 输入: |
题解:
1
2
3
4
5
6
7
8 select a1.machine_id , round((sum(a2.timestamp)-sum(a1.timestamp))/count(a1.machine_id),3) processing_time
from
Activity as a1 join Activity as a2
on a1.machine_id = a2.machine_id
and a1.process_id=a2.process_id
and a1.activity_type = 'start'
and a2.activity_type = 'end'
group by a1.machine_id;举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | machine_id | process_id | activity_type | timestamp |
| ---------- | ---------- | ------------- | --------- |
| 0 | 0 | start | 0.712 |
| 0 | 0 | end | 1.52 |
| 0 | 1 | start | 3.14 |
| 0 | 1 | end | 4.12 |
| 1 | 0 | start | 0.55 |
| 1 | 0 | end | 1.55 |
| 1 | 1 | start | 0.43 |
| 1 | 1 | end | 1.42 |
| 2 | 0 | start | 4.1 |
| 2 | 0 | end | 4.512 |
| 2 | 1 | start | 2.5 |
| 2 | 1 | end | 5 |调用如下 sql 代码
1
2
3
4
5
6
7 select a1.machine_id as machine_id , a1.process_id as a1process_id , a1.timestamp as start_time , a2.timestamp as end_time
from
Activity as a1 join Activity as a2
on a1.machine_id = a2.machine_id
and a1.process_id=a2.process_id
and a1.activity_type = 'start'
and a2.activity_type = 'end'得到如下
1
2
3
4
5
6
7
8 | machine_id | a1process_id | start_time | end_time |
| ---------- | ------------ | ---------- | -------- |
| 0 | 0 | 0.712 | 1.52 |
| 0 | 1 | 3.14 | 4.12 |
| 1 | 0 | 0.55 | 1.55 |
| 1 | 1 | 0.43 | 1.42 |
| 2 | 0 | 4.1 | 4.512 |
| 2 | 1 | 2.5 | 5 |所以
sum(a2.timestamp) - sum(a1.timestamp) / count(a1.machine_id)
就是每个机器平均每个进程的运行时间当然也可以简化
avg(a2.timestamp - a1.timestamp)
Ps : 我是后来才之后有求平均数的函数的(╯°□°)╯︵┻━┻
3. 力扣 1667. 修复表中的名字 简单
表: Users
1 | +----------------+---------+ |
编写解决方案,修复名字,使得只有第一个字符是大写的,其余都是小写的。
返回按 user_id
排序的结果表。
返回结果格式示例如下。
示例 1:
1 | 输入: |
解答:
感觉这个题就是纯粹考函数
1
2
3 select user_id, concat(Upper(substring(name,1,1)),lower(substring(name,2))) as name
from Users
order by user_id;
concat
字符串连接
Upper
字母大写
Lower
字母小写
substring
截取字符串
- Title: 数据库-练习题
- Author: lucas
- Created at : 2024-04-24 17:02:37
- Updated at : 2024-11-28 08:13:40
- Link: https://darkflamemasterdev.github.io/2024/04/24/数据库-练习题/
- License: This work is licensed under CC BY-NC-SA 4.0.