Mysql 如何将数据库记录分组为15分钟的时间间隔
我有一个表Mysql 如何将数据库记录分组为15分钟的时间间隔,mysql,sql,time-series,aggregate-functions,Mysql,Sql,Time Series,Aggregate Functions,我有一个表user\u access,在MySQL数据库中有以下列: id int user int access_time datetime 我正在尝试运行一个查询,该查询为我提供了一个用户在给定时间戳集内每隔15分钟访问系统的次数(访问时间) 我目前的查询是: select user, count(user) as users from user_access where (access_time between '2013-05-28 02:00:00' and '
user\u access
,在MySQL数据库中有以下列:
id int
user int
access_time datetime
我正在尝试运行一个查询,该查询为我提供了一个用户在给定时间戳集内每隔15分钟访问系统的次数(访问时间
)
我目前的查询是:
select user, count(user) as users from user_access
where (access_time between '2013-05-28 02:00:00' and '2013-05-28 10:00:00')
group by user
我试图实现的结果如下所示:
Time User No of Times
--------------------------------------------------
8:00am - 8:15am user1 20
8:00am - 8:15am user2 5
8:15am - 8:30am user1 15
8:15am - 8:30am user2 23
您需要创建一个公式,将每个访问时间转换为最近的四分之一小时
比如:
CONCAT(Hour(access_time),":",floor(Minute(access_time)/15))*15)
然后,您可以将该公式放在select语句和group by语句中。您可以修改此伪代码语句以更改格式、添加每个季度的结束时间等。您需要创建一个公式,将每个访问时间转换为最近的季度时间
比如:
CONCAT(Hour(access_time),":",floor(Minute(access_time)/15))*15)
然后,您可以将该公式放在select语句和group by语句中。您可以修改此伪代码语句以更改格式、添加每季度的结束时间等。我将使用datediff和round进行处理
获取任意日期并使用TIMESTAMPDIFF获取小数点。将日期四舍五入为15分钟,然后分组
大概是
select TIMESTAMPDIFF(MINUTE,randDate,access_time) DIV 15 as time, user, count(id) as users from user_access
where (access_time > '2013-05-28 02:00:00' AND access_time < '2013-05-28 10:00:00')
GROUP BY user, time
从user\u access中选择TIMESTAMPDIFF(分钟、随机日期、访问时间)DIV 15作为时间、用户、计数(id)作为用户
其中(访问时间>'2013-05-28 02:00:00'和访问时间<'2013-05-28 10:00:00')
按用户、时间分组
然后你所要做的就是倒退,让它看起来漂亮。使用时间将日期添加到randDate,以返回到15分钟的间隔
这是相当粗糙的,但它应该足以让您走上正确的轨道。我将使用datediff和round来接近它
获取任意日期并使用TIMESTAMPDIFF获取小数点。将日期四舍五入为15分钟,然后分组
大概是
select TIMESTAMPDIFF(MINUTE,randDate,access_time) DIV 15 as time, user, count(id) as users from user_access
where (access_time > '2013-05-28 02:00:00' AND access_time < '2013-05-28 10:00:00')
GROUP BY user, time
从user\u access中选择TIMESTAMPDIFF(分钟、随机日期、访问时间)DIV 15作为时间、用户、计数(id)作为用户
其中(访问时间>'2013-05-28 02:00:00'和访问时间<'2013-05-28 10:00:00')
按用户、时间分组
然后你所要做的就是倒退,让它看起来漂亮。使用时间将日期添加到randDate,以返回到15分钟的间隔
这是相当粗糙的,但它应该足以让您走上正确的轨道。首先,您的WHERE
子句中有一个细微的错误。你需要:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
例如,它将'2014-05-07 14:53:22'
转换为'2014-05-07 14:45:00'
如果愿意,可以将其定义为存储函数,如下所示:
DELIMITER $$
DROP FUNCTION IF EXISTS `TRUNC_15_MINUTES`$$
CREATE FUNCTION `TRUNC_15_MINUTES`(datestamp DATETIME)
RETURNS DATETIME
NO SQL
DETERMINISTIC
RETURN DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE$$
DELIMITER ;
然后,您可以这样编写查询:
select TRUNC_15_MINUTES(access_time) AS period_starting,
user, count(user) as users
from user_access
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
group by TRUNC_15_MINUTES(access_time), user
order by TRUNC_15_MINUTES(access_time), user
选择TRUNC_15_分钟(访问时间)作为时段开始,
用户,将(用户)计数为用户
从用户访问
其中访问时间>='2013-05-28 02:00:00'
访问时间<'2013-05-28 10:00:00'
按TRUNC_15_分钟(访问时间)分组,用户
按TRUNC_订购15_分钟(访问时间),用户
这是写在这里的 首先,您的WHERE
子句中有一个微妙的错误。你需要:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
例如,它将'2014-05-07 14:53:22'
转换为'2014-05-07 14:45:00'
如果愿意,可以将其定义为存储函数,如下所示:
DELIMITER $$
DROP FUNCTION IF EXISTS `TRUNC_15_MINUTES`$$
CREATE FUNCTION `TRUNC_15_MINUTES`(datestamp DATETIME)
RETURNS DATETIME
NO SQL
DETERMINISTIC
RETURN DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE$$
DELIMITER ;
然后,您可以这样编写查询:
select TRUNC_15_MINUTES(access_time) AS period_starting,
user, count(user) as users
from user_access
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
group by TRUNC_15_MINUTES(access_time), user
order by TRUNC_15_MINUTES(access_time), user
选择TRUNC_15_分钟(访问时间)作为时段开始,
用户,将(用户)计数为用户
从用户访问
其中访问时间>='2013-05-28 02:00:00'
访问时间<'2013-05-28 10:00:00'
按TRUNC_15_分钟(访问时间)分组,用户
按TRUNC_订购15_分钟(访问时间),用户
这是写在这里的 如果用户在指定的时间段内没有访问权限,您希望发生什么?@GordonLinoff Nice one。我从来没想过。没有用户记录时为零。您发布的“结果”是预期结果还是当前结果?@GigaWatt结果是预期结果格式。我还没有完全开发查询。如果用户在指定的时间段内没有访问权限,您希望发生什么?@GordonLinoff Nice one。我从来没想过。没有用户记录时为零。您发布的“结果”是预期结果还是当前结果?@GigaWatt结果是预期结果格式。我还没有完全开发这个查询,这是MySQL。您需要的是CONCAT()
,而不是&
。对不起。伪代码。添加了Concat()。重点是将单个实例动态转换为四分之一小时这是MySQL。您需要的是CONCAT()
,而不是&
。对不起。伪代码。添加了Concat()。重点是将单个实例动态转换为四分之一小时的响应。我还在测试。如果在特定的15分钟间隔内没有返回任何结果,我如何将用户
设置为0
?包含零行应该是另一个问题的主题(除非@GordonLinoff知道一些非常巧妙的技巧)。我目前正在测试该查询,完成后会与您联系。谢谢你的努力。关于如何从查询中将具有间隔值和默认users
的行包含为0
的问题,如我所说,这是另一个问题。但这里有一个指向一些想法的指针。回答很好。我还在测试。如果在特定的15分钟间隔内没有返回任何结果,我如何将用户
设置为0
?包含零行应该是另一个问题的主题(除非@GordonLinoff知道一些非常巧妙的技巧)。我目前正在测试该查询,完成后会与您联系。谢谢你的努力。关于如何从查询中将具有间隔值和默认users
的行包含为0
的问题,如我所说,这是另一个问题。但这里有一个指向一些想法的指针。