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

月总刷题数和日均刷题数

https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746

这道题目有两种思路,第一种思路,也是我直接想到的思路,就是先算出月份汇总,最后添加一列年份汇总,代码如下:

select date_format(submit_time,'%Y%m') submit_month

,count(submit_time) month_q_cnt

,round(count(submit_time)/max(day(last_day(submit_time))),3) avg_day_q_cnt

from practice_record

where year(submit_time)=2021

group by date_format(submit_time,'%Y%m')

union

select '2021汇总' as submit_month

,count(question_id) month_q_cnt

,round(count(id)/31,3) avg_day_q_cnt

from practice_record

where year(submit_time)=2021

order by submit_month

#尤其需要注意的是第一部分的day函数前必须要取一个max函数,否则会因为分组group by报错,原因是count函数指定的对象有两行,因此day函数返回的也是两行,但是count只输出一个值,不能对应两行,所以要使用max函数将结果变成一个;

还有一个点就是第二部分,要创造一列,可以直接select+‘观测值’,

第二种思路就是使用coalesce 函数 配合 group by 后的with rollup函数,前者是类似于case when 的一个函数,例如:

coalesce(A,B,1),意思是如果A这个变量不是null的话,就返回A,如果A是null,B不是null的话就返回B,如前两者都是null的话就返回1,;

with rollup函数是一个和group by 配合使用的,类似与group by后面的一个option,意思是对聚合后的字段进行汇总计算,

这个方法也是我在题解里看到的其他大神写的,分享给大家

select coalesce(year_mon,'2021汇总') submit_month

,count(question_id) month_q_cnt

,round(count(question_id)/max(t.days_month),3) avg_day_q_cnt

from (

select question_id

,day(last_day(submit_time)) days_month

,date_format(submit_time,'%Y%m') year_mon

from practice_record

where year(submit_time)=2021) t

group by t.year_mon with rollup

一起学习!

全部评论

相关推荐

dachang盒子:26届秋招必须有实习经历,建议找个实习过度下,同时项目重复率也比较高没有什么难点亮点,我这里有大厂真实的项目可以提供给你学习也可以给你包装大厂实习来提高你的竞争力,感兴趣的话可以私信我或者点我主页简介
你已经投递多少份简历了
点赞 评论 收藏
分享
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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