题解 | #月总刷题数和日均刷题数#
月总刷题数和日均刷题数
https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746
太难了吧这题,知道大概要做什么,但是怎么做真的不知道。最终参考了别人的题解然后弄懂。
用到的函数:
- DATE_FORMAT 日期转换行数,DATE_FORMAT(submit_time,'%Y%m') 将submit_time的日期转换为 年+月 的形式
- LAST_DAY()是一个日期函数,它返回给定日期值所在月份的最后一天
- union all 按照相同的列名进行联结
详细解释
查询1:
- group by DATE_FORMAT(submit_time,'%Y%m') 所有的数据按照 年月 进行分组
- DATE_FORMAT(submit_time,'%Y%m') as submit_month 选出 年月 作为第一列:提交月份
- count(*) as month_q_cnt 按照 年月 分组计数 行 的数量,就是:月刷题数
- round(count(*) /avg(day(LAST_DAY(submit_time))) ,3) as avg_day_q_cnt 月刷题数 除以 该月的天数。问题来了:求该月有多少天,这是一个难点。
- LAST_DAY(submit_time) 返回submit_time所在月份的最后一天
- day(LAST_DAY(submit_time)) 获取 submit_time 字段或值所在月份的最后一天的日期,并返回该日期的天数部分
- avg(day(LAST_DAY(submit_time))) 求出天数的平均值。至于为什么用avg(),这是考虑了mysql不同版本的问题,旧版如果不用聚合函数的话,是无法取出 30 或者 31 这个day的,会报错。新版分组不聚合的话默认取第一个,不报错。
- count(*) /avg(day(LAST_DAY(submit_time))) 月刷题数 除以 天数的平均值
- round 保留三位小数
- score is not null and year(submit_time) = '2021' 查询条件
查询2:
- round(count(*) /31 ,3) 这里按照题意直接 除以 31 即可
select DATE_FORMAT(submit_time,'%Y%m') as submit_month, count(*) as month_q_cnt, round(count(*) /avg(day(LAST_DAY(submit_time))) ,3) as avg_day_q_cnt from practice_record where score is not null and year(submit_time) = '2021' group by DATE_FORMAT(submit_time,'%Y%m') union all select '2021汇总' as submit_month, count(*) as month_q_cnt, round(count(*) /31 ,3) as avg_day_q_cnt -- /30 会不通过用例 from practice_record where score is not null and year(submit_time) = '2021' order by submit_month;
查看7道真题和解析
