判断使用窗口函数还是分组,关键在于你的业务需求是只需要聚合结果,还是需要在保留原始数据的基础上进行计算,以及是否需要为每行数据提供基于分组的额外信息。本题需要计算平均值后和成绩比较,需要保留原数据,则使用窗口函数。
问题分析:
1.表连接:先将三个表进行join连接 直接把非领导条件放上 where
2.求时间和分数的平均值:需要保留原数据和平均值作比较,所以使用窗口函数。
时间差:timestampdiff(minute,start_time,submit_time) avg() over(partition by emp_id)
分数:avg(score)over(partition by emp_id)
3.按条件输出:突出员工满足两个条件 时间小于平均,分数大于平均 再排序
select emp_id,emp_level,exam_tag
from (
select r.exam_id,m.emp_id,m.emp_level,i.tag as exam_tag,
timestampdiff(minute,start_time,submit_time) as t,
avg(timestampdiff(minute,start_time,submit_time))over(partition by r.exam_id) as avgt,
score,
avg(score)over (partition by r.exam_id) as avgs
from exam_record as r
left join examination_info as i on r.exam_id=i.exam_id
left join emp_info as m on m.emp_id=r.emp_id
where emp_level <7
order by exam_id
) t1
where t<=avgt and score>=avgs
order by emp_id;