2012-06-29 30 views
0

我有一个非常简单的MySQL表SQL查询结果分组到每小时桶

Name | Time | Count 
James | 11:00 | 10 
Simon | 11:00 | 5 
James | 11:30 | 4 
Oliver| 11:30 | 2 
James | 12:00 | 1 
etc. 

我想创建一个MySQL查询其求和计算每个人并输出最后1个小时值,最后3小时值,最后6小时值,最后12小时值和最后24小时值。

例如如果现在的时间是12:59上表将输出:

Name | Last-1 | Last-3 | Last-6 
James | 1  | 15  | 15 
Simon | 0  | 5  | 5 
Oliver| 0  | 2  | 2 

是否有可能做到这一点在单个查询?到目前为止,我有:

SELECT name, HOUR(NOW()) - HOUR(time) AS lasthours, SUM(count) AS c 
FROM table 
GROUP BY name, lasthours 
HAVING lasthours =0 
ORDER BY c DESC 

哪给了我过去一小时,但如何获得额外的列?

任何帮助非常感谢。

编辑:

接受的答案需要稍微调整就出来了,如下所示:

SELECT name , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=0, count , 0)) AS `Last hour` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=3, count , 0)) AS `Last 3 hours` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=6, count , 0)) AS `Last 6 hours` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=12, count , 0)) AS `Last 12 hours` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=24, count , 0)) AS `Last 24 hours` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=48, count , 0)) AS `Last 2 days` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=72, count , 0)) AS `Last 3 days` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=96, count , 0)) AS `Last 4 days` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=120, count , 0)) AS `Last 5 days` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=144, count , 0)) AS `Last 6 days` , 
     SUM(IF(HOUR(TIMEDIFF(NOW() , time)) <=168, count , 0)) AS `Last week` 
FROM table 
GROUP BY name 
ORDER BY `Last hour` DESC 

回答

2
SELECT `name`, 
     SUM(IF(HOUR(TIMEDIFF(CURTIME(), `Time`)) <= 1, `Count`, 0)) AS `Last-1`, 
     SUM(IF(HOUR(TIMEDIFF(CURTIME(), `Time`)) <= 3, `Count`, 0)) AS `Last-3`, 
     SUM(IF(HOUR(TIMEDIFF(CURTIME(), `Time`)) <= 6, `Count`, 0)) AS `Last-6` 
FROM  `table` 
GROUP BY `name` 

看到它的sqlfiddle

+0

这是优秀的,谢谢。虽然我不得不将CURTIME()更改为NOW() – user1491032

1

试试这个

Select Name,Sum(Case When Hour(Now)-Hour(Time) <= 1 Then Count Else 0 End) As Last1, 
Sum(Case When Hour(Now)-Hour(Time) Between 2 AND 3 Then Count Else 0 End) As Last3, 
Sum(Case When Hour(Now)-Hour(Time) Between 4 And 6 Then Count Else 0 End) As Last6 
From name 
Order By 
+0

稍微调整了这些作品,但我更喜欢下面的解决方案。不管怎样,谢谢你! – user1491032