SQL24 分别满足两个活动的人
题目主要信息:
- 分别筛选出2021年每次试卷得分都能到85分的人(activity1)和至少有一次用了一半时间就完成高难度试卷且分数大于80的人(activity2)
- 按照用户ID排序
问题拆分:
- 筛选2021年每次试卷得分都大于等于85的人和字符串'activity1':
- 按照uid进行分组划分,统计每个用户的得分情况。知识点:group by
- 选出提交时间在2021年的试卷。知识点:select...from...where...、year()
- 对于每组要求判断最小得分不小于85。知识点:having、min()
- 筛选2021年至少有一次用了一半时间就完成高难度试卷且分数大于80的人和字符串'activity2':
- 试卷信息和考试信息分布在两个表中,须将其通过exam_id连接起来。知识点:join...on...
- 从连接后的两个表格中满足四个条件的不重复的用户ID,因为只要求至少一次下述情况(知识点:distinct、where...and...):
- 提交时间是2021年。
year(e_r.submit_time) = 2021
- 试卷难度是困难。
e_i.difficulty = 'hard'
- 得分大于80。
e_r.score > 80
- 只用了试卷要求时间一半不到的时间就完成。
timestampdiff(minute, e_r.start_time, e_r.submit_time) * 2 < e_i.duration
- 将两个筛选合并。知识点:union all
- 按照用户ID排序输出。知识点:order by uid
代码:
select uid,
'activity1' as activity
from exam_record
where year(submit_time) = 2021
group by uid
having min(score) >= 85
union all
select distinct uid,
'activity2' as activity
from exam_record e_r join examination_info e_i
on e_r.exam_id = e_i.exam_id
where year(e_r.submit_time) = 2021
and e_i.difficulty = 'hard'
and e_r.score > 80
and timestampdiff(minute, e_r.start_time, e_r.submit_time) * 2 < e_i.duration
order by uid