mysql 数据分析如何实现日报、周报、月报和年报?
以天为统计周期,是常见需求。周报、月报更是常见需求。长周期项目,甚至有年报需求。我已经掌握了
mysql中按天统计,如何实现按年、按月、按周统计呢?
1、已掌握的技能:按天统计
实现以天为统计周期很简单。具体来说,
date()函数可返回时间数据的日期,即仅有年月日,没有时分秒信息。结合
group by可实现按天统计。
以天为统计周期的数据指标非常多,随便举例,比如每日新增注册用户数。
select date(created_at) as 注册日期, count(user_id) as 用户数 from users group by 注册日期 order by 注册日期
2、从已知推理,拓展技能
既然
date()函数可用,那么是否有对应的
year、
month、
week等函数可用呢?这纯属我的推理,那试试看吧。
果然可行。但美中不足的是,返回的周数和月数不带年份。当数据量跨年时,它会把每年相同周数或月数的数据加在一起。如何实现
某年某月和
某年某周呢?已有知识储备去推理,没找到答案,那就直接搜索吧!
3、搜索找答案
经过搜索和尝试发现,在mysql中用
date_format(column_name,'%Y-%m')来代替
month()就能拿到
年月值。
如果把其中代表月month的关键字
m换成周week呢?试试看。分别尝试:
date_format(column_name,'%Y-%w')和
date_format(column_name,'%Y-%W')。
数据返回结果不对呀?并不是预期的今年第几周。小写的
w返回的是本周第几天,大写的
W返回的是周几的英文名。如何拿到
今年第几周这个值,实现周报的统计周期呢?
4、觉察知识点欠缺,查漏补缺
我自学编程时,很喜欢从已知去推理,拓展自己的技能。通常推理能带来惊喜,当推理不够用时,那就搜索大法好。搜索特定问题的答案时,通常也能发现某块知识不足。比如我这里我就意识到自己不熟悉表达日期的关键字或常用语法。
恰好搜索时遇到相濡以沫66的文章,里面有很好的整理。
MySQL日期格式化(format)取值范围。
值 | ||
---|---|---|
秒 | %S、%s | 两位数字形式的秒( 00,01, ..., 59) |
分 | %I、%i | 两位数字形式的分( 00,01, ..., 59) |
小时 | %H | 24小时制,两位数形式小时(00,01, ...,23) |
%h | 12小时制,两位数形式小时(00,01, ...,12) | |
%k | 24小时制,数形式小时(0,1, ...,23) | |
%l | 12小时制,数形式小时(0,1, ...,12) | |
%T | 24小时制,时间形式(HH:mm:ss) | |
%r | 12小时制,时间形式(hh:mm:ss AM 或 PM) | |
%p | AM上午或PM下午 | |
周 | %W | 一周中每一天的名称(Sunday,Monday, ...,Saturday) |
%a | 一周中每一天名称的缩写(Sun,Mon, ...,Sat) | |
%w | 以数字形式标识周(0=Sunday,1=Monday, ...,6=Saturday) | |
%U | 数字表示周数,星期天为周中第一天 | |
%u | 数字表示周数,星期一为周中第一天 | |
天 | %d | 两位数字表示月中天数(01,02, ...,31) |
%e | 数字表示月中天数(1,2, ...,31) | |
%D | 英文后缀表示月中天数(1st,2nd,3rd ...) | |
%j | 以三位数字表示年中天数(001,002, ...,366) | |
月 | %M | 英文月名(January,February, ...,December) |
%b | 英文缩写月名(Jan,Feb, ...,Dec) | |
%m | 两位数字表示月份(01,02, ...,12) | |
%c | 数字表示月份(1,2, ...,12) | |
年 | %Y | 四位数字表示的年份(2015,2016...) |
%y | 两位数字表示的年份(15,16...) | |
文字输出 | %文字 | 直接输出文字内容 |
把单个知识点,稍微提升到某块知识点,能让自己的知识技能再上一个台阶。
5、求助也是社交,问人附红包
上述表格相当实用,但依然没有解决如何获得“某年第几周”的需求。
虽然说主动检索找到答案,是很好的习惯。但自己耗费大量时间也没找到答案,又恰恰有目标相同的人一起互助,何不问问人看呢?学习么,本质上是个社交行为。在学一样技能时,我喜欢泡几个氛围好的学习群。经常在群里分享自己的心得笔记,也会主动力所能及地帮助别人,或者提出自己的疑问引发探讨。求助就是一种很好的社交行为啊。
此时我把疑问丢到编程学习群,并附上红包请教。经指点很快得到答案,用到了
concat()函数来拼接。
方便大家拷贝学习,放一下代码吧:
select concat(date_format(created_at,'%Y-'),week(created_at)) as 年周, count(user_id) as 用户数 from users group by 年周 order by 年周
6、小结
总结一下,mysql中可通过
date_format()和
concat(),
week()等函数可完成数据分析中常用的月报、周报中按月、周统计的需求。关键语句为:
date(column_name) as 年月日
date_format(column_name,'%Y-%m') as 年月
concat(date_format(column_name,'%Y-'),week(column_name) as 年周
这篇笔记除了知识点,我也放了自己探索扩展技能的思路。是否对你有启发呢?如果有,记得留言或点赞告诉我,鼓励我多多分享。
特别申明:这篇笔记图中数据为本地数据库,仅供本人练习使用,并非任何产品网站的正式数据。
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1b687s5btzw42
- mysql随机取数据,如何实现高效率?
- mysql如何实现插入数据时如果不存在则插入如果存在则更新的操作
- SQL Server简单实现数据的日报和月报功能
- mysql创建存储过程实现往数据表中新增字段的方法分析
- SQL Server简单实现数据的日报和月报功能
- 企业如何实现对大数据的处理与分析?
- [原创]如何实现MySQL表数据随机读取
- 如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
- 如何把mysql的列修改成行显示数据简单实现
- Storm之——Storm+Kafka+Flume+Zookeeper+MySQL实现数据实时分析(程序案例篇)
- mysql随机取数据,如何实现高效率?
- mysql随机取数据,如何实现高效率?
- 那些年java web开发中遇到的问题(4)---如何实现表单提交(插入数据到mysql)
- 从百万级别数据的分析角度,Mysql,Mongodb,Hbase如何选择?
- MySQL数据表的数据类型、如何实现数据完整性以及日期函数等的基本知识点整理
- Spring实现原理分析(二十五).Spring Boot如何把application.*中的配置数据转换成对象
- Storm之——Storm+Kafka+Flume+Zookeeper+MySQL实现数据实时分析(案例测试篇)
- 开源的Trafodion如何实现事务与分析一体化? - 大数据
- AirBnB如何在Druid上实现数据的实时和批量分析
- 开源的Trafodion如何实现事务与分析一体化? - 大数据