【SQL每日一练】day21:常考高频习题

题目一:查询回答率最高的问题

题目要求:

回答率 是指:同一问题编号中回答次数占显示次数的比率。

编写一个解决方案以报告 回答率 最高的问题。如果有多个问题具有相同的最大 回答率 ,返回 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;

猜你喜欢

转载自blog.csdn.net/Liu_y_xin/article/details/142108546