#注释是不使用窗口函数,直接使用group by和inner join完成
# select
#     emp_record.emp_id,
#     emp_record.emp_level,
#     tag
# from 
#     (
#         select 
#             emp_level,
#             emi.emp_id,
#             exam_id,
#             timestampdiff(second, start_time, submit_time) as cost_time,
#             score
#         from emp_info as emi
#         inner join exam_record er on emi.emp_id=er.emp_id and emp_level < 7
#     ) as emp_record
#     inner join 
#     (
#         select 
#             exam_id,
#             avg(timestampdiff(second, start_time, submit_time)) as avg_cost_time,
#             avg(score) as avg_score
#         from  exam_record
#         group by
#             exam_id
#     ) as avg_tb on emp_record.exam_id=avg_tb.exam_id and cost_time < avg_cost_time and score > avg_score
#     inner join examination_info on emp_record.exam_id=examination_info.exam_id 
# order by
#     emp_record.emp_id, emp_record.exam_id


/*
使用窗口函数
需要注意的是,对于SQL的查询过程是
  1.FROM / JOIN:确定数据来源,加载表并关联。
  2.WHERE:过滤原始数据(基于行级条件)。
  3.GROUP BY:对数据分组。
  4.HAVING:过滤分组后的结果(基于聚合条件)。
  5.窗口函数(如 ROW_NUMBER()、AVG() OVER(...)):在分组 / 过滤后的数据上计算窗口结果。
  6.SELECT:提取最终需要的列(包括窗口函数的别名)。
  7.ORDER BY:对结果排序(可以使用窗口函数别名)。
 因此不能对于窗口函数查询的结果直接having cost_time < avg_cost_time and score < avg_score,需要使用子查询(外面直接嵌套一个select * from(...)as就行)或者CTE(Common Table Expression) ,CTE类似临时表,使用with as创建,之后在整个SQL都能访问。
*/
select
    emi.emp_id,
    emi.emp_level,
    tag
from 
    emp_info as emi
    inner join 
        (
            with avg_tb as(
                select
                    emp_id, 
                    exam_id,
                    timestampdiff(second, start_time, submit_time) as cost_time,
                    avg(timestampdiff(second, start_time, submit_time)) over(partition by exam_id) as avg_cost_time,
                    score, 
                    avg(score) over(partition by exam_id) as avg_score
                from exam_record
            ) 
            select * 
            from avg_tb
            where score > avg_score and cost_time < avg_cost_time 
        ) as great_emp on emi.emp_id=great_emp.emp_id and emp_level < 7
    inner join examination_info on examination_info.exam_id=great_emp.exam_id
order by
    great_emp.emp_id, great_emp.exam_id