最开始我想的是用date_format函数将submit_time中的year month取出来, 将结果集左连接到主表上 然后发现其实没有必要整一个结果集外连接

SELECT
    month,
    round(count(distinct uid))/ count(distinct e_r.uid),2)  avg_active_days,
    round(count(distinct e_r.uid),2) mau
FROM
    exam_record e_r
        LEFT JOIN
    (
        SELECT uid,
               exam_id,ubmit
               id,
               date_format(submit_time, '%Y%m') month
        FROM exam_record
) mon
ON
    mon.id = e_r.id
where
    month is not null
    and year(submit_time) =2021
group by
    month;

直接将结果表示出来就行了也就是用一次就写一次date_format(submit_time,"%Y%m")

然后发现我的计算月活人数的写法是有bug的

也就是

如果一个人在同一个时间提交了两次我这种写法会把他当一个人来看待,也就是说avg算出来会有错误 alt 所以应该是

round(COUNT(distinct uid,date_format(submit_time,'%Y%m%d'))/ count(distinct uid),2) 来计算月活人数

最终代码就是

SELECT
    date_format(submit_time,'%Y%m') mouth,
    round(COUNT(distinct uid,date_format(submit_time,'%Y%m%d'))/ count(distinct uid),2)  avg_active_days,
    round(count(distinct uid),2) mau
FROM
    exam_record
where
    submit_time is not null
    and year(submit_time) =2021
group by
    date_format(submit_time,'%Y%m');

还可以用like函数来匹配year

submit_time like '2021%'

也能有同样效果,时间以及占用可能更少