题目一:查询回答率最高的问题
题目要求:
回答率 是指:同一问题编号中回答次数占显示次数的比率。
编写一个解决方案以报告 回答率 最高的问题。如果有多个问题具有相同的最大 回答率 ,返回
question_id
最小的那个。
表结构:
运行结果示例:
思路:
按照回答率降序排序,如果回答率相同则按照题目id排序,限制显示条数为1条即可。其中回答率的计算可以使用sum()函数结合case子句判断计算。
运行代码示例:
select question_id as survey_log
from SurveyLog
group by question_id
order by sum(case when action = 'answer' then 1 else 0 end) / sum(case when action = 'show' then 1 else 0 end) desc,question_id
limit 1
题目二:当选者
题目要求:
编写解决方案来报告获胜候选人的名字(即获得最多选票的候选人)。
生成的测试用例保证 只有一个候选人赢得 选举。
表结构:
运行结果示例:
思路:
将候选人名单作为主表与投票表进行连接,按照投票表中的候选人id进行分组计算每组数据的数量,并按照降序排序,返回最大的一条数据对应的候选人名字。
运行代码示例:
select name from Candidate c
left join Vote v
on v.candidateId = c.id
group by candidateId
order by count(v.id) desc
limit 1
题目三:求团队人数
题目要求:
编写解决方案以求得每个员工所在团队的总人数。
返回结果表 无顺序要求 。
表结构:
运行结果示例:
思路:
先分组统计每一个团队的人数,并将查询结果作为临时表与原表连接,获得每个员工所在的团队对应的人数。
运行代码示例:
with temp as (
select team_id,count(*) as team_size
from Employee
group by team_id
)
select employee_id ,team_size from Employee
join temp using (team_id)
题目四:报告的记录
题目要求:
编写解决方案,针对每个举报原因统计昨天的举报帖子数量。假设今天是
2019-07-05
。返回结果表 无顺序要求 。
表结构:
运行结果示例:
思路:
按照题目要求进行筛选即可,需要注意需要统计数量时需要对报告的帖子进行去重处理。
运行代码示例:
select extra as report_reason,count(distinct post_id) as report_count
from Actions
where action = 'report' and datediff('2019-07-05', action_date) = 1
group by extra
题目五:直线上的最近距离
题目要求:
找到
Point
表中任意两点之间的最短距离。
表结构:
运行结果示例:
思路:
直接自连接本表,用x的值减去其他x的值即可, 需要注意要将计算结果使用abs()函数进行处理转换成绝对值,或者在筛选条件中再加一条计算结果大于0,否则会返回一个负数。
运行代码示例:
select min(abs(a.x-b.x)) shortest
from point a,point b
where a.x!=b.x
题目六:好友申请I总体通过率
题目要求:
求出好友申请的通过率,用 2 位小数表示。通过率由接受好友申请的数目除以申请总数。
提示:
- 通过的好友申请不一定都在表
friend_request
中。你只需要统计总的被通过的申请数(不管它们在不在表FriendRequest
中),并将它除以申请总数,得到通过率- 一个好友申请发送者有可能会给接受者发几条好友申请,也有可能一个好友申请会被通过好几次。这种情况下,重复的好友申请只统计一次。
- 如果一个好友申请都没有,你应该返回
accept_rate
为 0.00 。
表结构:
运行结果示例:
思路:
分别查询出通过请求数和请求总数,再进行计算,主要需要先对空值进行处理,使用ifnull()函数判断数值是否为空,为空则转换成0,再四舍五入保留2位小数。
运行代码示例:
select round(
ifnull(
(select count(*) from(
select distinct requester_id, accepter_id
from request_accepted)
as A)
/
(select count(*) from(
select distinct sender_id, send_to_id
from friend_request)
as B)
, 0)
, 2) as accept_rate;