我正在尝试执行一个按hour
获取数据的查询,但是按小时而不是正常组,我想缩小范围,只获得latest
小时 - 意味着最新的数据那个小时。如下图所示,我想得到的是带红色框的行。如果您注意到,第一个红色行是10:59:51
,这意味着它是10:00:00
和10:59:59
中唯一的行。对于12:00
及以上的其他行,我想获得12:37:14
,因为它是该小时范围的最新或最新。
我有一个简单的查询,使用hour
按HOUR()
对数据进行分组,如:
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)
但是,查询只是按小时10
和12
对其进行分组,返回ID 24
和25
- 但我需要的是 id < / strong> 24
和28
。有什么想法吗?
答案 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的查询就是你想要的。