mysql 数据分析如何实现日报、周报、月报和年报?

以天为统计周期,是常见需求。周报、月报更是常见需求。长周期项目,甚至有年报需求。我已经掌握了mysql中按天统计,如何实现按年、按月、按周统计呢?html

一、已掌握的技能:按天统计

实现以天为统计周期很简单。具体来讲,date() 函数可返回时间数据的日期,即仅有年月日,没有时分秒信息。结合 group by 可实现按天统计。mysql

以天为统计周期的数据指标很是多,随便举例,好比每日新增注册用户数。sql

select
    date(created_at) as 注册日期,
    count(user_id) as 用户数
from
     users
group by
    注册日期
order by
    注册日期
复制代码

image

二、从已知推理,拓展技能

既然date()函数可用,那么是否有对应的 yearmonthweek 等函数可用呢?这纯属个人推理,那试试看吧。数据库

image

果真可行。但美中不足的是,返回的周数和月数不带年份。当数据量跨年时,它会把每一年相同周数或月数的数据加在一块儿。如何实现某年某月某年某周呢?已有知识储备去推理,没找到答案,那就直接搜索吧!编程

三、搜索找答案

通过搜索和尝试发现,在mysql中用date_format(column_name,'%Y-%m')来代替month()就能拿到年月值。函数

image

若是把其中表明月month的关键字m换成周week呢?试试看。分别尝试: date_format(column_name,'%Y-%w')date_format(column_name,'%Y-%W')学习

image

数据返回结果不对呀?并非预期的今年第几周。小写的w返回的是本周第几天,大写的W返回的是周几的英文名。如何拿到今年第几周这个值,实现周报的统计周期呢?网站

四、觉察知识点欠缺,查漏补缺

我自学编程时,很喜欢从已知去推理,拓展本身的技能。一般推理能带来惊喜,当推理不够用时,那就搜索大法好。搜索特定问题的答案时,一般也能发现某块知识不足。好比我这里我就意识到本身不熟悉表达日期的关键字或经常使用语法。spa

刚好搜索时遇到相濡以沫66的文章,里面有很好的整理。code

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...)
文字输出 %文字 直接输出文字内容

把单个知识点,稍微提高到某块知识点,能让本身的知识技能再上一个台阶。

五、求助也是社交,问人附红包

上述表格至关实用,但依然没有解决如何得到“某年第几周”的需求。

虽说主动检索找到答案,是很好的习惯。但本身耗费大量时间也没找到答案,又偏偏有目标相同的人一块儿互助,何不问问人看呢?学习么,本质上是个社交行为。在学同样技能时,我喜欢泡几个氛围好的学习群。常常在群里分享本身的心得笔记,也会主动力所能及地帮助别人,或者提出本身的疑问引起探讨。求助就是一种很好的社交行为啊。

此时我把疑问丢到编程学习群,并附上红包请教。经指点很快获得答案,用到了concat()函数来拼接。

image

方便你们拷贝学习,放一下代码吧:

select
    concat(date_format(created_at,'%Y-'),week(created_at)) as 年周,
    count(user_id) as 用户数
from
     users
group by
    年周
order by
    年周
复制代码

六、小结

总结一下,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 年周

这篇笔记除了知识点,我也放了本身探索扩展技能的思路。是否对你有启发呢?若是有,记得留言或点赞告诉我,鼓励我多多分享。

特别申明:这篇笔记图中数据为本地数据库,仅供本人练习使用,并不是任何产品网站的正式数据。

相关文章
相关标签/搜索