当前位置: 首页 > news >正文

牛客网SQL进阶127: 月总刷题数和日均刷题数

  官网链接:

月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record,示例内容如下:。题目来自【牛客题霸】icon-default.png?t=N7T8https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId=240

0 问题描述

    基于练习记录表practice_record,统计出2021年每个月里用户的月总刷题数month_q_cnt 和日均刷题数avg_day_q_cnt(按月份升序排序)以及该年的总体情况,示例数据输出如下:

1 数据准备

CREATE TABLE  practice_record (id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',uid int NOT NULL COMMENT '用户ID',question_id int NOT NULL COMMENT '题目ID',submit_time datetime COMMENT '提交时间',score tinyint COMMENT '得分'
)CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO practice_record(uid,question_id,submit_time,score) VALUES
(1001, 8001, '2021-08-02 11:41:01', 60),
(1002, 8001, '2021-09-02 19:30:01', 50),
(1002, 8001, '2021-09-02 19:20:01', 70),
(1002, 8002, '2021-09-02 19:38:01', 70),
(1003, 8002, '2021-08-01 19:38:01', 80);

2 数据分析

方式一:union all 常规做法

-- 方式一:
selectDATE_FORMAT(submit_time,'%Y%m') as submit_month,count(1)as month_q_cnt,round(count(1)/ 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')
union all
select'2021汇总' as submit_month,count(1) as month_q_cnt,round(count(1) / 31 ,3) as avg_day_q_cnt
from practice_record 
where score is not null and year(submit_time) = '2021'
order by submit_month;

上述代码用到的函数:last_day()返回参数日期的最后一天,day(last_day())返回当月的天数

ps:这里最容易出错的点在于:每月天数的计算

(1) 计算每个月的天数可以用函数:day(last_day(datetime));
(2) 一年12月,每个月的天数: case when month(datetime) in (1,3,5,7,8,10,12) then 31 else 30 end 
(3) 最容易出错的点在于 : group by DATE_FORMAT(submit_time,'%Y%m') 分组后,select后面只能跟:group by 分组字段、常量、以及 count()/ max()/min()/avg()/sum()等聚合函数;

     由于 count(1) / max(day(last_day(submit_time))  中 分子count(1)用的是聚合函数,分母也必须用聚合函数,而函数day() 不是聚合函数,因此分母最终的逻辑为:max(day(last_day(submit_time)) 或min(day(last_day(submit_time))

方式二:with rollup

select coalesce(months,'2021汇总') as submit_month,count(question_id) as month_q_cnt,round(count(question_id)/max(days),3) as avg_day_cnt
from(select question_id,date_format(submit_time,'%Y%m') as months,day(last_day(submit_time)) as daysfrom practice_recordwhere year(submit_time)= '2021')  tmp1
group by months
with rollup;

上述代码拆解:

step1:利用date_format函数及day(last_day(submit_time)) 函数分别获取月份及当月的天数

select question_id,date_format(submit_time,'%Y%m') as months,day(last_day(submit_time)) as days
from practice_recordwhere year(submit_time)= '2021'

step2:  利用 group by with rollup 实现分组加和,利用ifnull/coalesce函数进行null值判断及补全:coalesce(months,'2021汇总') as submit_month

最终的代码如下:

select coalesce(months,'2021汇总') as submit_month,count(question_id) as month_q_cnt,round(count(question_id)/max(days),3) as avg_day_cnt
from(select question_id,date_format(submit_time,'%Y%m') as months,day(last_day(submit_time)) as daysfrom practice_recordwhere year(submit_time)= '2021')  tmp1
group by months
with rollup;

group by with rollup具体使用案例见文章:

MySQL ——group by子句使用with rollup-CSDN博客MySQL ——group by子句使用with rolluphttps://blog.csdn.net/SHWAITME/article/details/136078305?spm=1001.2014.3001.5502

3 小结

   上述案例最关键的点在于:group by 分组后,select后面只能跟:

(1) groupby 分组的字段;

(2)常量;

(3) count()、 max()、 min()、avg()、sum()等聚合函数;

相关文章:

  • Kafka 使用手册
  • 获取视频帧图片
  • Spring Boot配置文件优先级
  • 贪心算法的应用
  • 环境配置:Ubuntu18.04 ROS Melodic安装
  • re:从0开始的CSS学习之路 3. CSS三大特性
  • ctfshow-命令执行(web73-web77)
  • Android kotlin build.gradle.kts配置
  • Unity3d Shader篇(三)— 片元半兰伯特着色器解析
  • iOS AlDente 1.0自动防过充, 拯救电池健康度
  • 嵌入式硬件工程师与嵌入式软件工程师
  • 制度下降算法c语言
  • 第十二章 以编程方式使用 SQL 网关 - 直接调用 ODBC 函数
  • freesql orm 使用 DynamicFilterInfo 拼接日期查询条件时间格式一个难得的经验
  • 深入浅出:Golang的Crypto/SHA256库实战指南
  • input的行数自动增减
  • leetcode386. Lexicographical Numbers
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux快速复制或删除大量小文件
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 闭包,sync使用细节
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 多线程事务回滚
  • 巧用 TypeScript (一)
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • ​VRRP 虚拟路由冗余协议(华为)
  • !!Dom4j 学习笔记
  • # 飞书APP集成平台-数字化落地
  • #git 撤消对文件的更改
  • #if 1...#endif
  • $.each()与$(selector).each()
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (145)光线追踪距离场柔和阴影
  • (附源码)计算机毕业设计高校学生选课系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六)激光线扫描-三维重建
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (顺序)容器的好伴侣 --- 容器适配器
  • (万字长文)Spring的核心知识尽揽其中
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net web项目 调用webService
  • .net 反编译_.net反编译的相关问题
  • .NET 服务 ServiceController
  • .NET企业级应用架构设计系列之应用服务器
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [Android Studio] 开发Java 程序
  • [C语言]编译和链接
  • [IE9] IE9 Beta崩溃问题解决方案
  • [IE编程] IE中使网页元素进入编辑模式
  • [LeetCode 687]最长同值路径
  • [LeetCode] 196. 删除重复的电子邮箱
  • [Leetcode] Permutations II
  • [Linux]如何理解kernel、shell、bash
  • [Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件
  • [MFC] MFC 获取指定窗口截图(大小可调)