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

月总刷题数和日均刷题数

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

明确题意:

统计出2021年每个月里用户的月总刷题数month_q_cnt 和日均刷题数avg_day_q_cnt,以及该年的总体情况


问题分解:

  • 筛选2021年的刷题记录:where year(submit_time)='2021'
  • 获取当月的天数:DAYOFMONTH(LAST_DAY(submit_time))
  • 获取当月的年月:DATE_FORMAT(submit_time, "%Y%m") as y_m
  • 统计每月的总刷题数和日均刷题数:
    • 先按年月分组:group by y_m
    • 统计月总刷题数:count(1)
    • 月均刷题数=月总刷题数÷该月天数:count(1) / max(days_of_month)
    • 汇总情况:with rollup

细节问题:

  • 表头重命名:as
  • 汇总情况的month列为null,需判断后重置:ifnull(y_m, '2021汇总')
  • 保留3位小数:round(..., 3)

完整代码:

select ifnull(y_m, '2021汇总') as submit_month,
    count(1) as month_q_cnt,
    round(count(1) / max(days_of_month), 3) as avg_day_q_cnt
from (
    select question_id,
        DAYOFMONTH(LAST_DAY(submit_time)) as days_of_month,
        DATE_FORMAT(submit_time, "%Y%m") as y_m
    from practice_record
    where year(submit_time)='2021'
) as t_month_stat
group by y_m
with rollup
SQL进阶 文章被收录于专栏

SQL进阶step by step

全部评论
因为group by 必须搭配聚合函数,count()/day()不算聚合,count()/max()才是
4 回复 分享
发布于 2022-01-22 12:50
ifnull太妙了 跟着学到的越来越多 感谢!
2 回复 分享
发布于 2022-08-08 20:08
写错了,最后应该是每个月的天数。“为什么days_of_month要加max啊,Dayofmonth(last_day())这个函数不是已经得出每个月的议天数了吗”
2 回复 分享
发布于 2021-10-25 15:03
请问一次,题目中要求对月份进行排序,您用with rollup 之后怎么排序呢?
1 回复 分享
发布于 2023-03-22 21:31 北京
请问,with rollup,对分组后的各组记录进行求和,求和的是group by之后的第一个字段,那么为什么month_q_cnt也会得到求和计算呢?
点赞 回复 分享
发布于 2023-02-16 17:03 辽宁
本题中ifnull,请问是有遍历每一个分组的作用吗,后台执行过程是什么样子的呢?
点赞 回复 分享
发布于 2023-02-16 17:00 辽宁
count(1) 会统计表中的所有的记录数,包含字段为null 的记录。 count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。 即不统计字段为null 的记录。
点赞 回复 分享
发布于 2022-10-27 13:30 浙江
为什么用max()不能用any_value()呢?
点赞 回复 分享
发布于 2022-07-17 11:58
题目中按照月份排序这个不需要order by吗?但加上又会报错
点赞 回复 分享
发布于 2022-07-17 10:05
如果有记录的月份恰好天数都小于31天呢?是不是就不能用with rollup这种方法,只能单算汇总列再union all
点赞 回复 分享
发布于 2022-07-16 16:31
关于楼上的问题,我也遇到过,老哥方便的话请看看,没有嵌套子查询,并直接使用GROUPING和CASE WHEN来做,会出现full group by错误: SELECT CASE WHEN GROUPING(DATE_FORMAT(submit_time, "%Y%m")) = 1 THEN '2021汇总' ELSE DATE_FORMAT(submit_time, "%Y%m") END AS submit_month, COUNT(submit_time) AS month_q_cnt, ROUND(COUNT(submit_time) / MAX(DAY(LAST_DAY(submit_time))), 3) AS avg_day_q_cnt FROM practice_record WHERE YEAR(submit_time) = 2021 GROUP BY DATE_FORMAT(submit_time, "%Y%m") WITH ROLLUP
点赞 回复 分享
发布于 2022-07-11 19:43
请问一下,为什么月总刷题数是count(1)
点赞 回复 分享
发布于 2022-03-19 15:58
提个问题,为什么不嵌套的时候会报错因为ziduan不符合group by,感觉似乎是因为with rollup的问题,一般来说不嵌套两个字段count和max也都可以用
点赞 回复 分享
发布于 2022-03-07 11:54
为什么days_of_month要加max啊,Dayofmonth(last_day())这个函数不是已经得出每个月的月份了吗
点赞 回复 分享
发布于 2021-10-25 14:58

相关推荐

ming_ri:“很抱歉,您的简历和我们当前的职位需求不是很匹配”
点赞 评论 收藏
分享
渐好:软光栅真的写明白了吗,既然是软渲那技术栈不应该使用OpenGL,光追和bvh既不算什么高级渲染技术更不应该属于软渲的内容,git那个项目没啥用,建议把前两个项目重新组织一下语言,比如软渲染那个项目 冯着色和msaa、贴图这几项分开写,写的到位点,如果你还学过光追那就单独写出来,如果没把握考官问你答不上来就别写给自己找麻烦,在技术栈那一栏简单提一下自己学过就行,这样杂的放在一起不太严谨,个人愚见.
点赞 评论 收藏
分享
评论
39
7
分享

创作者周榜

更多
牛客网
牛客企业服务