题解 | #月总刷题数和日均刷题数#
月总刷题数和日均刷题数
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
一起学习!
查看4道真题和解析