MySQL:如何按小时分组数据并获取最新的小时数

时间:2011-05-26 10:21:44

标签: mysql sql grouping

我正在尝试执行一个按hour获取数据的查询,但是按小时而不是正常组,我想缩小范围,只获得latest小时 - 意味着最新的数据那个小时。如下图所示,我想得到的是带红色框的行。如果您注意到,第一个红色行是10:59:51,这意味着它是10:00:0010:59:59中唯一的行。对于12:00及以上的其他行,我想获得12:37:14,因为它是该小时范围的最新或最新。

enter image description here

我有一个简单的查询,使用hourHOUR()对数据进行分组,如:

SELECT userid, username, date_created
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)

但是,查询只是按小时1012对其进行分组,返回ID 2425 - 但我需要的是 id < / strong> 2428。有什么想法吗?

4 个答案:

答案 0 :(得分:19)

答案 1 :(得分:5)

也许这会有用吗?

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)
)

答案 2 :(得分:1)

我不得不假设如果跨越多天你也会在白天也想要它,否则一小时的max()可以给你一周前的一小时与三天前的另一天,以及当天的一天另一个......那就是,如果你跨越你的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_created上有自己的索引......或者至少在索引的第一个位置。

答案 3 :(得分:0)

你的意思是从现在开始一小时或最近一小时? 如果这是最新的整整一小时这样的事可能有用吗?

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);

编辑: 啊,现在我觉得我得到你想要的东西......你日期范围内每个给定小时的最后一个添加条目?

如果是这样,那么Codler的查询就是你想要的。