题解 | #满足条件的用户的试卷完成数和题目练习数#

满足条件的用户的试卷完成数和题目练习数

http://www.nowcoder.com/practice/5c03f761b36046649ee71f05e1ceecbf

# 高难度SQL试卷得分平均值大于80并且是7级的红名大佬
# 统计他们的2021年试卷总完成次数和题目总练习次数
# 只保留2021年有试卷完成记录的用户
select er1.uid, count(er1.submit_time) exam_cnt, 
(select count(pr.submit_time) 
 from practice_record pr 
 where pr.uid=er1.uid 
 and year(pr.submit_time)=2021)  question_cnt
from exam_record er1
where er1.uid in (select er.uid
                  from exam_record er inner join user_info ui
                  on er.uid=ui.uid
                  inner join examination_info ei
                  on er.exam_id=ei.exam_id
                  where ei.tag='SQL' 
                  and ei.difficulty='hard' 
                  and ui.level=7 and year(er.submit_time)=2021
                  group by uid
                  having avg(score)>80)
and year(submit_time)=2021
group by er1.uid
order by exam_cnt asc, question_cnt desc

思路:

  1. 根据题意分析条件, 条件越多, 其实越好分析
  2. 关键点是 uid, 我们只要知道了 uid, 就可以通过uid带出其他所有我们想要关注的uid的附属特征, 例如题中说的大佬2021年的试卷完成数, 以及其他的数据
  3. 所以,为了提高效率, 联结表格次数越少越好, 每一次联结都是求笛卡尔积的过程, 非常耗时
  4. 在where的 in 判断后 按照条件求得 uid 后
  5. 在select子句中用关联子查询带出 uid即可,不用再次联结
全部评论

相关推荐

06-26 15:33
青岛工学院 Java
积极的秋田犬要冲国企:他现在邀请我明天面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务