相关文章推荐
冷静的豌豆  ·  mysql ...·  1 月前    · 
开朗的大白菜  ·  python / shell / ...·  1 月前    · 
私奔的火车  ·  basic_ifstream クラス | ...·  1 年前    · 
知识渊博的跑步鞋  ·  header pandas-掘金·  1 年前    · 
成熟的椰子  ·  python下载pdf文件-掘金·  1 年前    · 
  • 按天统计
  • 按小时统计
  • 按半小时统计
  • 按N分钟统计
  • 按分钟统计

mysql不同时间粒度下的分组统计

我们在做项目或者数据分析时,经常遇到这样的需求:统计不同时间粒度下的数据分布情况,例如,每一天中每个小时网站的访问量,某路口每半个小时通过的车辆数量等。对于此类的问题,一个sql简单的查询就能实现,故特此记录下,方便以后使用。

在MySQL中,我的表为:track
数据结构如下所示:

SELECT DATE(TimeStart) AS date, COUNT(*) AS num
FROM track
WHERE Flag = 0 AND Duration >= 300 
GROUP BY date
ORDER BY date;


按小时统计

SELECT DATE_FORMAT(TimeStart, '%Y-%m-%d %H:00:00') AS time, COUNT(*) AS num
FROM track
WHERE Flag = 0 AND Duration >= 300
GROUP BY time
ORDER BY time;

按N小时统计

SELECT time,COUNT(*) AS num FROM
		SELECT
			DATE_FORMAT(
				concat(
					date(TimeStart),
					FLOOR(HOUR(TimeStart) / 2) * 2
				'%Y-%m-%d %H:%00:00'
			) AS time
			t_table
GROUP BY DATE_FORMAT(time, '%Y-%m-%d %H:%00:00')


结果如下:

按半小时统计

SELECT time, COUNT( * ) AS num 
    SELECT Duration,
        DATE_FORMAT(
            concat( date( TimeStart ), ' ', HOUR ( TimeStart ), ':', floor( MINUTE ( TimeStart ) / 30 ) * 30 ),
            '%Y-%m-%d %H:%i' 
        ) AS time 
    FROM tarck
    WHERE Flag = 0  AND Duration >= 300 
GROUP BY DATE_FORMAT( time, '%Y-%m-%d %H:%i' ) 
ORDER BY time;


结果如下:

按N分钟统计

将上面的SQL语句稍微修改下,就可以实现按任意N分钟为时间片的分组统计,如按10分钟统计,先上代码:

SELECT time, COUNT( * ) AS num 
    SELECT Duration,
        DATE_FORMAT(
            concat( date( TimeStart ), ' ', HOUR ( TimeStart ), ':', floor( MINUTE ( TimeStart ) / 10 ) * 10 ),
            '%Y-%m-%d %H:%i' 
        ) AS time 
    FROM tarck
    WHERE Flag = 0  AND Duration >= 300 
GROUP BY DATE_FORMAT( time, '%Y-%m-%d %H:%i' ) 
ORDER BY time;


基本思路:
将datetime类型的时间转化为相应时间片的时间,例如将‘2017-03-01 01:08:19’ 转化为‘2017-03-01 01:00:00’,然后group by即可。

按分钟统计

将按小时统计的SQL语句稍微修改下,就可以实现按分钟统计

SELECT DATE_FORMAT(TimeStart, '%Y-%m-%d %H:%i:00') AS time, COUNT(*) AS num
FROM track 
WHERE Flag = 0 AND Duration >= 300
GROUP BY time
ORDER BY time;


DATE_FORMAT功能强大,可以根据format字符串格式化date值,参考下面链接
http://www.w3school.com.cn/sql/func_date_format.asp
参考博客:

https://blog.csdn.net/kaka_buka/article/details/52614643
https://blog.csdn.net/Beingccccc/article/details/78685490
---------------------
原文网址: https://blog.csdn.net/u010946448/article/details/83752984

原文链接: https://blog.csdn.net/u010946448/article/details/83752984 访问量 Visits 访问量指的是某一段时间内网站被访问的总次数。这无疑是网站流量最重要的指标之一,它体现了网站推广手法的总体效果。 流量分析软件都可以按时间,比如每天或每星期,显示出访问数。很多软件还可以以图形方式显示,就更加直观。 在 进行 了某项特定营销活动后,检验效果如何的第一个指标当然就是看所带来的访问数。比如网站的文章被社会化网络大量转载,都经常会带来访问数的急剧提高,但通常在一两天 create table tb(时间 datetime , 金额 int) insert into tb values('2007-1-1 10:00:23' ,          8 ) insert into tb values('2007-1-1 10:01:24' ,          4 ) insert into tb val 一张电话报表(id,time,telephone) time:表示顾客打入时记录的时间实例如下:1 2006-06-11 05:52:12 13600654607582 2006-06-11 06:09:05 13801380172923 2006-06-11 06:25:13 973638493104 2006-06-11 06:26:08 617638493105 2006-06-11 06: 这个SQL语句的主要功能是从" count_driver_warn" 表中选出所有created_date在7天内的记录,并按照驾驶员名字 分组 计算每个驾驶员的警告次数数量和警告类型,然后按警告次数从高到低排序。如果有张表是GPS信息,log_bus_driver,其中有经度、纬度字段bus_longitute,bus_latitute,时间是created_date,想按照每5分钟 进行 分段取信息 进行 分析,如何做?子句来 统计 特定时间范围内的 数据 。:将所有驾驶员的记录 进行 分组 ,聚合 统计 每个驾驶员的总警告次数。 --这个按每五分钟的,你稍微改改就行了. [code=SQL]create table tb(时间 datetime , 金额 int) insert into tb values('2007-1-1 10:00:23' , 8 ) insert into tb values('2007-1-1 10:01:24' , 4 ) insert ... SELECT DATE_FORMAT(departure_time,'%Y-%m-%d') as demand_time , count(0) as count FROM haikou_1 where left(`geo`,6)='w7w3y2' AND DATE_FORMAT(departure_time,'%Y-%m-%d') BETWEEN '2017-06-01' AND '2017-08-31' GROUP BY demand_time ORDER BY demand_time 只需要关联开始时间的hour就可以,因为开始和结束时间都是同一个hour下,这样关联每一条记录会膨胀12条 数据 。判断游戏时长大于1h的为异常 数据 ,已经过滤了游戏耗时大于1h的 数据 ,所以目前 数据 的情况是。可以看到 开始时间和结束时间判断对应的时间点是否在线的规则是不一样的。得到相对应的时间点,再判断,这个点是否在开始时间和结束时间的区间内。情况1:游戏开始时间和结束时间是在同一天,同一个 小时 内,则。1,游戏开始时间和结束时间是在同一天,同一个 小时 内;2,游戏开始时间和结束时间是同一天,不同 小时 内; 按照秒 统计 数据 并倒叙排列取前50条 数据 : SELECT DATE_FORMAT(insert_time, '%Y-%m-%d %H:%i:%S') AS time, COUNT(*) AS num FROM t_cust WHERE revisit_state in ('3','4') GROUP BY time ORDER BY num DESC limit 50; 按照分钟 统计 数据 并倒叙排列取前50条 数据 : SELECT DATE_FORMAT(insert_time, '%Y-%m-%d %H:% 前些日子,在做项目的时候遇到一个比较奇葩(其实就是不会)的查询,就是根据传入的时间查询条件,对返回的 数据 做一次汇总,可能是按照n分钟、n 小时 或者n天(具体怎么根据时间控制间隔,我这里就不说了)。下面进入真题。 时间间隔类型可分为分钟、 小时 、天,根据不同的时间间隔类型,有如下规则(其中 小时 、天的原理与分钟基本一致): 1)按分钟汇... 解决方法: 第一个方法,是分时间段 统计 ,用case解决每个时间段都精确的写出来。 但是表中的 数据 已经跨年了,这种方法仅适合 统计 的时间跨度比较大的情况(比如 统计 每年的 数据 量)。 第二个方法,把时间处理,思路是这样的。