mysql实现按照某个时间段分组统计
作者:Rum?chen 发布时间:2024-01-14 21:18:36
mysql按照某个时间段分组统计
今天刚好是碰到一个报表需求,要求根据时段统计各工单的数量。这个就有点皮实了,以前都没搞过这玩意。于是研究了几下。
准备开始
首先一个问题,想根据时间段进行统计,这个问题先不考虑,先考虑,如果按照一小时统计呢,该怎么去做,于是就一顿操作,写出以下sql,这个基本的相信没什么难度,主要是说,怎么去单独拿到小时,这里用到“DATE_FORMAT”函数。
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' )
到这里,小时统计没问题了,那么怎么改造成符合我的需求呢,请看图片
相信聪明的人已经感觉出来的,就是其实把我们取到的小时去除以时间段的区间取整数,那么就可以得到同一区间的数据,然后这个数字在乘回去我们的区间,就可以得到上限,在加区间就是下限,最终我们得到的SQL
-- 区间数字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区间分组统计
场景
表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,实现了这种范围分组的效果
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连接这张表就可以实现分组效果
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()
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;
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


猜你喜欢
- 一提到数字图像处理,可能大多数人就会想到matlab,但matlab也有自身的缺点:1、不开源,价格贵2、软件容量大。一般3G以上,高版本甚
- 因客户需求,要把数据库里的索引编号做成五位长度的,且能自动累加编号,我只会在SQL中使用Identity自动编号:Create Table
- 今天闲着没事干,以前做过html+js版的数独,这次做个python版本的,界面由pygame完成,数独生成由递归算法实现,由shuffle
- 使用python进行图片处理,现在需要读出图片的任意一块区域,并将其转化为一维数组,方便后续卷积操作的使用。 下面使用两种方法进行处理:co
- 首先来说,让一个游戏赋有可玩性必须要动静结合。(哈哈,大家以为我要讲作文了。。。但其实我今天要讲的是Javascript)静态的东西谁不会做
- 一、安装MySQL下载MySQL的社区版的压缩包:https://dev.mysql.com/get/Downloads/MySQL-8.0
- 本文实例为大家分享了vue实现价格日历效果的具体代码,供大家参考,具体内容如下1、效果图2、下载全局安装:npm install ele-c
- 主机环境:(Python2.7.9 / Win8_64 / bs4)利用BeautifulSoup4来抓取 www.pm25.com 上的P
- 本文实例为大家分享了readAsDataUrl方法预览图片的具体代码,供大家参考,具体内容如下<html> <head&
- 前言通常都听到别人说,计算机很牛逼,很聪明,其实计算机一点都不聪明,光是你要跟他沟通,都会气 shi你,聪明的是在写程序的你。写程序就是跟计
- 我们使用 python setup.py install 来安装python包,但是如何卸载呢?只能手动删除安装的文件可以使用如下命令pyt
- 程序运行效率程序的运行效率分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。时间复杂度主要
- 1433 SQL入侵恢复xp_cmdshell方法总结 sql server 2005下开启xp_cmdshell的办法 EXEC sp_c
- 如何显示一个等待或欢迎信息? <% Response.Buffer = True %
- 本文示例可见一斑了,主要是通过Java对SQL语句进行操作,和普通的增删改查的原理是一样的:import java.sql.*; publi
- 本文为大家分享了php运行环境搭建安装图文教程,供大家参考,具体内容如下安装apache:1,不要安装到有中文的目录中:2,尽量将apach
- 1.PyQtGraph简介:pyqtgraph的主要用途:1、为数据、绘图、视频等提供快速、可交互图形显示。2、提供快速开发应用的工具。2.
- Aphorismthe fight is worth it.django models 连接 sqlite 数据库django 版本为 1.
- 1. 不使用全局变量,适当封装2. 兼容性还行~~3. 代码短,可读性凑合~~呵呵~~~~~a. 拖动效果,16行JS<!DOCTYP
- 本文实例讲述了Python3.5实现的罗马数字转换成整数功能。分享给大家供大家参考,具体如下:问题概述:给定一个罗马数字 ,将罗马数字转换成