问题描述
||
我正在尝试执行一个查询,该查询每
hour
提取数据,但不是按小时分组,而是要缩小范围,仅获取latest
小时-表示该小时内的最新数据。下面显示的图片是我想要得到的带有红色框的行。如果您会注意到,第一行红色是10:59:51
,这表示它是唯一在10:00:00
和10:59:59
之内的行。对于12:00
及以上的其余行,我想得到12:37:14
,因为它是该小时范围内的最新或最新信息。
我有一个简单的查询,使用HOUR()
将数据按ѭ0分组,例如:
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
分组,返回ID24
和25
-但我需要的是id24
和28
。有任何想法吗?
解决方法
尝试
SELECT f.*
FROM (
SELECT MAX(UNIX_TIMESTAMP(date_created)) AS mts
FROM user_accounts
GROUP BY HOUR(date_created)
) s
JOIN user_accounts f
ON UNIX_TIMESTAMP(date_created) = s.mts
WHERE DATE(date_created) = \'2009-10-27\'
,也许这行得通吗?
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)
)
,我不得不假设,如果您跨越多天,也同样希望每天都这样做,否则一个小时的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分组,只需确保您的表在date_created上创建了索引即可,或者至少在索引的第一位。
,您是说现在开始一个小时还是最近一个小时?
如果是最近一小时的工作时间,可能会起作用吗?
SELECT userid,date_created
FROM user_accounts
WHERE HOUR(date_created) = (SELECT HOUR(date_created) FROM user_accounts ORDER BY date_created DESC LIMIT 1);
编辑:
嗯,现在我想我就会得到您想要的...日期范围之间每隔指定小时的最后添加的条目?
如果是这样,那么Codler的查询就是您想要的。
,我用这个解决方案
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;
希望这对某人有帮助。