题解 | #月总刷题数和日均刷题数#

月总刷题数和日均刷题数

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;

全部评论

相关推荐

在笔试的大西瓜很矫健:校招数分不用想了,这经历和学历都不够用,大厂更别想,初筛都过不了,说点不好听的小厂数分都进不去(小厂也是假数分),要两个对口实习+3个项目(或者3+2),而且要有含金量才能补一点你的学历劣势。 建议刷实习,社招找数分,校招看运气,能入行业就行,可以运营转数分
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务