Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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:如何对每小时的数据进行分组并获取最新的小时数_Mysql_Sql_Grouping - Fatal编程技术网

MySQL:如何对每小时的数据进行分组并获取最新的小时数

MySQL:如何对每小时的数据进行分组并获取最新的小时数,mysql,sql,grouping,Mysql,Sql,Grouping,我试图做一个每小时获取数据的查询,但不是按小时进行的正常分组,我希望缩小范围,只获取最新的小时数,即该小时内的最新数据。如下图所示,我想得到的是带有红色框的行。如果你注意到的话,第一个红色的行是10:59:51,这意味着它是唯一一个在10:00:00和10:59:59之间的行。对于12:00及以上的其他行,我希望得到12:37:14,因为它是该小时范围内的最新或最新 我有一个简单的查询,它使用小时将数据按小时分组,如: 然而,查询只是按小时10和12对其进行分组,返回id 24和25——但我需要

我试图做一个每小时获取数据的查询,但不是按小时进行的正常分组,我希望缩小范围,只获取最新的小时数,即该小时内的最新数据。如下图所示,我想得到的是带有红色框的行。如果你注意到的话,第一个红色的行是10:59:51,这意味着它是唯一一个在10:00:00和10:59:59之间的行。对于12:00及以上的其他行,我希望得到12:37:14,因为它是该小时范围内的最新或最新

我有一个简单的查询,它使用小时将数据按小时分组,如:

然而,查询只是按小时10和12对其进行分组,返回id 24和25——但我需要的是id 24和28。有什么想法吗?

也许这行得通

SELECT userid, username, date_created
FROM user_accounts 
WHERE userid IN (
  SELECT MAX(userid)
  FROM user_accounts 
  WHERE date_created >= '2009-10-27 00:00:00' AND date_created < '2009-10-27 23:59:59'
  GROUP BY HOUR(date_created)
)
试一试


你是说从现在起一小时还是最近一个小时? 如果是最近的一个小时,像这样的事情可能会奏效吗

SELECT userid, username, date_created
FROM user_accounts 
WHERE HOUR(date_created) = (SELECT HOUR(date_created) FROM user_accounts ORDER BY date_created DESC LIMIT 1);
编辑: 啊,现在我想我得到了你想要的。。。在您的日期范围内每隔一小时最后添加的条目


如果是这样的话,那么科德勒的查询就是你想要的。

我不得不假设,如果跨越多天,你也会想要它,否则一个小时的最大值可以给你一周前的一个小时,而不是三天前的另一个,以及今天的另一个。。。如果你的范围超出了WHERE条款的范围,特别是限制你的单日范围。这不是由你想要的特定用户决定的,而是那个小时最后一次活动的人。。。可能是同一个人,每次都可能完全不同。我把特定的日期作为集体测试的一部分,以防你想要跨越一个日期范围,但你也可以把它去掉

select STRAIGHT_JOIN
       ui.userid,
       ui.username,
       ui.date_created
   from 
       ( select
               date( date_created ),
               hour( date_created ),
               max( date_created ) as LastPerHour
            from
               user_accounts
            where
               date( date_created ) = '2009-10-27'
            group by
               date( date_created), 
               hour( date_created )) PreQuery
      join user_accounts ui
         on PreQuery.LastPerHour = ui.date_created
同样,我也将date作为一个分组,如果您想跨越多天,只需确保您的表中有一个关于date_的索引,该索引是由它自己创建的。。。或者至少在索引的第一个位置。

我使用这个解决方案

select date(PROCESS_DATE),hour(PROCESS_DATE),EVENT,COUNT(*) from statistics group by EVENT,date(PROCESS_DATE),time(PROCESS_TIME) order by 1 desc, 2 desc limit 1;

希望这对其他人有所帮助。

你不能假设MAXid意味着MAXdate\u created,尤其是当你可以使用MAXdate\u created而不需要嵌套查询时!令人惊叹的我从来没有想过使用子选择,通过使用MAX,实际上可以在创建的分组HOURdate_中获得最高的ID。我试过这个,效果很好,谢谢@Gordon Murray Dent,在数据上下文中,用户ID是表的一个自动递增值,并且不会与实际创建时的顺序不一致。。。因此,是的,它可以直接暗示给定时间的最后一个用户ID将起作用。如果在同一日期,较低ID的时间比较高ID的时间长,则这将不起作用:假设ID=27的时间为12:37,ID=28的时间为12:34@diEcho这是一个自动增量,因此更高的ID总是获得更新的日期/时间。因为每次插入都会有一个最新的日期/时间,所以较低的ID不可能有较高的ID。实际上,我可以单独使用MAX,但我感谢您的回答,因为我已经测试了它并正在工作。当我需要的时候,我会参考你的解决方案+1:@tradyblix,是的,我也喜欢另一个只使用每小时最大用户ID的解决方案。。。但这只能在提供数据时起作用,因为所讨论的列是自动递增的。现在,如果您试图查找某人最后一次执行某项操作的时间,例如用户1是给定小时内的最后一个用户而不是用户25的日志历史记录,那么这将是您的解决方案。。。我希望你能理解为什么一个查询与另一个不同。完美解决方案@diEcho。。。谢天谢地,2009年10月27日这场比赛只赢了一排,而不是我所期望的。是的,刚才。我在2009-10-27的5行中只有一行。@diEcho+1-这个查询最优雅-它将处理更新时更改的时间戳,id将不是在一小时内查找最新条目的合适方法。谢谢你!也试试我的答案;它是优化的
select STRAIGHT_JOIN
       ui.userid,
       ui.username,
       ui.date_created
   from 
       ( select
               date( date_created ),
               hour( date_created ),
               max( date_created ) as LastPerHour
            from
               user_accounts
            where
               date( date_created ) = '2009-10-27'
            group by
               date( date_created), 
               hour( date_created )) PreQuery
      join user_accounts ui
         on PreQuery.LastPerHour = ui.date_created
select date(PROCESS_DATE),hour(PROCESS_DATE),EVENT,COUNT(*) from statistics group by EVENT,date(PROCESS_DATE),time(PROCESS_TIME) order by 1 desc, 2 desc limit 1;