服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - mysql实现按照某个时间段分组统计

mysql实现按照某个时间段分组统计

2022-11-24 15:51Rum chen Mysql

这篇文章主要介绍了mysql实现按照某个时间段分组统计方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql按照某个时间段分组统计

今天刚好是碰到一个报表需求,要求根据时段统计各工单的数量。这个就有点皮实了,以前都没搞过这玩意。于是研究了几下。

准备开始

首先一个问题,想根据时间段进行统计,这个问题先不考虑,先考虑,如果按照一小时统计呢,该怎么去做,于是就一顿操作,写出以下sql,这个基本的相信没什么难度,主要是说,怎么去单独拿到小时,这里用到“DATE_FORMAT”函数。

?
1
2
3
4
5
6
7
8
9
SELECT
    DATE_FORMAT( create_order_time, '%H' ) AS h,
    COUNT( 1 )
FROM
    order_item
GROUP BY
    DATE_FORMAT( create_order_time, '%H' )
ORDER BY
    DATE_FORMAT( create_order_time, '%H' )

mysql实现按照某个时间段分组统计

到这里,小时统计没问题了,那么怎么改造成符合我的需求呢,请看图片

mysql实现按照某个时间段分组统计

相信聪明的人已经感觉出来的,就是其实把我们取到的小时去除以时间段的区间取整数,那么就可以得到同一区间的数据,然后这个数字在乘回去我们的区间,就可以得到上限,在加区间就是下限,最终我们得到的SQL

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--  区间数字SQL
SELECT
    (FLOOR(DATE_FORMAT( create_order_time, '%H' ) / 2) * 2) AS h2,
    COUNT( 1 )
FROM
    order_item
GROUP BY
    FLOOR(DATE_FORMAT( create_order_time, '%H' ) / 2)
ORDER BY
    FLOOR(DATE_FORMAT( create_order_time, '%H' ) / 2)
 
-- 最终SQL
SELECT
     CONCAT(
     FLOOR( DATE_FORMAT( create_order_time, '%H' ) / 2 ) * 2,
     '-',
     FLOOR( DATE_FORMAT( create_order_time, '%H' ) / 2 ) * 2 + 2)
     AS h2,
    COUNT( 1 )
FROM
    order_item
GROUP BY
    FLOOR( DATE_FORMAT( create_order_time, '%H' ) / 2 )
ORDER BY
    FLOOR( DATE_FORMAT( create_order_time, '%H' ) / 2 )

样图

mysql实现按照某个时间段分组统计

mysql区间分组统计

场景

表cases,有完成时间(finish_time),id等字段

现在将finish_time按时间区间划分年份

例 2021-11-01 00:00:00 ~2022-10-31 23:59:59 为2022年

下面是模拟数据:

id finish_time
1 2019-01-23 23:23:23
2 2019-02-28 12:12:12
3 2020-08-12 08:12:12
4 2021-05-12 22:12:43
5 2022-05-12 23:23:23

统计结果应该如下所示:

年份 数量
2019 2
2020 1
2021 1
2022 1

因为不能在cases表中添加字段,上网搜寻后找到两个方法:

  • 1、利用了mysql提供的interval和elt函数实现了效果。
  • 2、是建一张中间表用来分组

利用了mysql提供的interval和elt函数实现了效果

interval

interval(N,N1,N2,N3) ,比较列表中的N值,该函数如果N<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。

elt

elt(n,str1,str2,str3,…) 如果n=1,则返回str1,如果n=2,则返回str2,依次类推

两个函数结合,再加上group,实现了这种范围分组的效果

?
1
2
3
select elt(interval(finish_ime,'2019-11-01','2020-11-01','2021-11-01','2022-11-01'),2019,2020,2021,2022) as i,count(*)
from cases
group by i

但实际效果不尽人意,也许是因为mysql中interval也是处理日期的关键字吧,interval()函数对日期进行划分的时候每次都划分到最后一个区间,因此使用第二种办法即建一张中间表用来划分

建中间表

创建如下一张中间表(tmp)

start_date end_date year
2018-11-01 00:00:00 2019-10-31 23:59:59 2019
2019-11-01 00:00:00 2020-10-31 23:59:59 2020
2020-11-01 00:00:00 2021-10-31 23:59:59 2021
2021-11-01 00:00:00 2022-10-31 23:59:59 2022

cases表通过join连接这张表就可以实现分组效果

?
1
2
3
4
    select count(*) as '数量', t.`year` as "年份"
    from cases c left join tmp t on c.finish_time>=t.start_date and
                                    c.finish_time<=t.end_date 
    group by t.`year`

这样就可以在不修改原有表结构的基础上实现区间分组统计。

通过函数来划分区间

创建函数get_year()

?
1
2
3
4
5
6
7
8
9
10
create function get_year(finishTime datetime) returns int
begin
    declare d_year int(4);
    set d_year = year(finishTime);
    if (finishTime >= concat(d_year, '-11-01 00:00:00')) then
        return d_year + 1;
    else
        return d_year;
    end if;
end;
?
1
2
3
    select count(*) as '数量',get_year(c.finish_ime) as "年份"
    from cases c 
    group by get_year(c.finish_ime)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/Chen_RuiMin/article/details/116054995

延伸 · 阅读

精彩推荐
  • Mysqlmysql之set与enum的介绍

    mysql之set与enum的介绍

    本篇文章是对mysql中的set与enum进行了详细的分析介绍,需要的朋友参考下 ...

    MYSQL教程网5062019-12-29
  • MysqlMySQL之权限以及设计数据库案例讲解

    MySQL之权限以及设计数据库案例讲解

    这篇文章主要介绍了MySQL之权限以及设计数据库案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    狂神说11912021-09-17
  • MysqlMySQL存储过程概念、原理与常见用法详解

    MySQL存储过程概念、原理与常见用法详解

    这篇文章主要介绍了MySQL存储过程概念、原理与常见用法,结合实例形式详细分析了mysql存储过程的概念、原理、创建、删除、调用等各种常用技巧与相关注...

    webbc4742020-11-20
  • Mysql安全地关闭MySQL服务的教程

    安全地关闭MySQL服务的教程

    这篇文章主要介绍了安全地关闭MySQL服务的教程,包括使用kill指令时的一些注意点,需要的朋友可以参考下 ...

    叶金荣3132020-05-22
  • MysqlMySQL 撤销日志与重做日志(Undo Log与Redo Log)相关总结

    MySQL 撤销日志与重做日志(Undo Log与Redo Log)相关总结

    这篇文章主要介绍了MySQL 撤销日志与重做日志(Undo Log与Redo Log)相关总结,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下...

    Thresh11922021-04-28
  • Mysqlmysql自增id超大问题的排查与解决

    mysql自增id超大问题的排查与解决

    这篇文章主要给大家介绍了关于mysql自增id超大问题的排查与解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

    燕南飞Liam4852019-06-14
  • MysqlDOS命令行窗口mysql中文显示乱码问题解决方法

    DOS命令行窗口mysql中文显示乱码问题解决方法

    MySQL的默认编码是Latin1,不支持中文,如何修改MySQL的默认编码呢,下面为大家详细介绍下 ...

    MYSQL教程网5862020-03-31
  • Mysqlmysql-joins具体用法说明

    mysql-joins具体用法说明

    这篇文章主要介绍了mysql-joins具体用法说明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    Liberation-army8342021-04-20