Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何将数据库记录分组为15分钟的时间间隔_Mysql_Sql_Time Series_Aggregate Functions - Fatal编程技术网

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
的问题,如我所说,这是另一个问题。但这里有一个指向一些想法的指针。