mysql如何分别按年/月/日/周分组统计数据详解

 更新时间:2022年12月15日 11:21:05   作者:冰冷的希望  
我们在用Mysql抽取数据时候,经常需要按照天、周、月等不同的粒度对数据进行分组统计,下面这篇文章主要给大家介绍了关于mysql如何分别按年/月/日/周分组统计数据的相关资料,需要的朋友可以参考下

1.统计

我们可以使用date_format()函数格式化时间,然后进行分组操作

例如有一个学生表,结构如下

idnameageheightgendercreate_time
1pan2716912022-01-13 10:20:22
2yang1817712022-03-14 09:16:42
3daisy2515622022-07-19 19:58:03
-- 按年
select date_format(create_time, '%Y') years,avg(age),count(gender) from student where create_time > "2022-01-01 00:00:00" and create_time < "2022-07-19 19:58:03" group by years;
-- 按月
select date_format(create_time, '%Y-%m') months,avg(age),count(gender) from student where create_time > "2022-01-01 00:00:00" and create_time < "2022-07-19 19:58:03" group by months;
-- 按周
select date_format(create_time, '%Y-%u') weeks,avg(age),count(gender) from student where create_time > "2022-01-01 00:00:00" and create_time < "2022-07-19 19:58:03" group by weeks;
-- 按日
select date_format(create_time, '%Y-%m-%d') days,avg(age),count(gender) from student where create_time > "2022-01-01 00:00:00" and create_time < "2022-07-19 19:58:03" group by days;

如果不想用date_format函数,可以使用对应的year()/month()/week()/day()函数替代

2.占位符

date_format()需要传入一个特定的占位符,mysql常用的占位符可参考下表

占位符说明
%Y年(4位)
%y年(2位)
%M月(英文名,如January)
%m月(数字,如01)
%D日(英文名,如1st)
%d日(数字,如01)
%e日(数字,如1)
%U一年中的第几周,从0开始 ,周日是第一天
%u一年中的第几周,从0开始,周一是第一天
%H时,24小时制,例如15
%h时,12小时制,例如01
%i
%s

补充:Mysql如何指定日期按周分组,并按次数分类统计

需要统计今年以来,每周用户的提问次数,并按提问次数进行分类统计,格式如下:

大佬需求的格式

需求不能按自然周算,所以不适合用week()函数计算周数,只能根据提问时间和指定日期的时间差相除

第几周 =floor((提问时间-指定日期)/7)+1

确定了计算方式,首先按周和用户ID分组,查询周,提问次数,然后通过case when对查询结果按提问次数分类,sql如下:

SELECT weeks,
CONCAT(LEFT(MIN(create_time),10),"至",LEFT(MAX(create_time),10)) AS date_range,
SUM(CASE WHEN nums <= 5 THEN 1 ELSE 0 END) AS '提问次数<=5',
 SUM(CASE WHEN nums > 5 AND nums<=10 THEN 1 ELSE 0 END) AS '5<提问次数<=10',
 SUM(CASE WHEN nums > 10 THEN 1 ELSE 0 END) AS '提问次数>10' 
 FROM 
 (SELECT FLOOR(DATEDIFF(create_time,'2021-01-01')/7)+1 weeks,
 create_time,uid,COUNT(*) AS nums 
  FROM `youTable` 
   WHERE create_time > "2021-01-01" 
   GROUP BY weeks,uid ORDER BY create_time ASC LIMIT 100000)
    AS topic_table GROUP BY weeks

总结

到此这篇关于mysql如何分别按年/月/日/周分组统计数据的文章就介绍到这了,更多相关mysql分组统计数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL数据库之内置函数和自定义函数 function

    MySQL数据库之内置函数和自定义函数 function

    这篇文章主要介绍了MySQL数据库之内置函数和自定义函数 function,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • 解决MySQL批量新增或修改时出现异常:Lock wait timeout exceeded

    解决MySQL批量新增或修改时出现异常:Lock wait timeout exceeded

    这篇文章主要给大家介绍了关于如何解决MySQL批量新增或修改时出现异常:Lock wait timeout exceeded;try restarting transaction的相关资料,需要的朋友可以参考下
    2024-01-01
  • MySQL系列数据库设计三范式教程示例

    MySQL系列数据库设计三范式教程示例

    这篇文章主要为大家介绍了MySQL系列之数据库设计三范式的教程示例讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • MySQL多表查询的具体实例

    MySQL多表查询的具体实例

    这篇文章主要介绍了MySQL多表查询的具体实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Linux下MYSQL 5.7 找回root密码的问题(亲测可用)

    Linux下MYSQL 5.7 找回root密码的问题(亲测可用)

    这篇文章主要介绍了Linux下MYSQL 5.7 找回root密码的问题(亲测可用),通过 --skip-grant-tables 找回,新增完成后,:wq 保存退出,重启mysqld服务,具体内容详情跟随小编一起看看吧
    2021-10-10
  • 安装MySQL常见的三种方式

    安装MySQL常见的三种方式

    MySQL是一个开放源码的小型关联式数据库管理系统,被广泛地应用在Internet上的中小型网站中。接下来通过本篇文章给大家分享安装MySQL常见的三种方式,需要的朋友可以参考下
    2015-09-09
  • 使用存储过程实现循环插入100条记录

    使用存储过程实现循环插入100条记录

    本节主要介绍了使用存储过程实现循环插入100条记录的具体实现,需要的朋友可以参考下
    2014-07-07
  • MySQL实现批量检查表并进行repair与optimize的方法

    MySQL实现批量检查表并进行repair与optimize的方法

    这篇文章主要介绍了MySQL实现批量检查表并进行repair与optimize的方法,结合实例形式分析了MySQL批量修复与优化表的相关技巧,需要的朋友可以参考下
    2016-04-04
  • mysql 安全管理详情

    mysql 安全管理详情

    这篇文章主要介绍了mysql 安全管理,MySQL服务器的安全基础是用户应该对他们需要的数据具有适当的访问权,既不能多也不能少,换句话说,用户不能对过多的数据具有过多的访问权,下面俩看看文章详细内容吧
    2021-10-10
  • MySQL 压缩的使用场景和解决方案

    MySQL 压缩的使用场景和解决方案

    数据分布特点,决定了空间压缩的效率,如果存入的数据的重复率较高,其压缩率就会较高;通常情况下字符类型数据(CHAR, VARCHAR, TEXT or BLOB )具有较高的压缩率,而一些二进制数据或者一些已经压缩过的数据的压缩率不会很好
    2017-06-06

最新评论