首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将结果分组为每小时一次的SQL查询

将结果分组为每小时一次的SQL查询
EN

Stack Overflow用户
提问于 2012-06-29 11:35:59
回答 2查看 1.9K关注 0票数 0

我有一个非常简单的MySQL表

代码语言:javascript
复制
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,上表将输出:

代码语言:javascript
复制
Name  |  Last-1  |  Last-3  | Last-6
James |  1       |  15      | 15
Simon |  0       |  5       | 5
Oliver|  0       |  2       | 2

在一个查询中可以这样做吗?到目前为止,我已经:

代码语言:javascript
复制
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

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

任何帮助都很感激。

编辑:

接受的答案需要稍加调整,其结果如下:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-29 11:40:38

代码语言:javascript
复制
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`

请在木琴上看到。

票数 2
EN

Stack Overflow用户

发布于 2012-06-29 11:41:11

尝尝这个

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11261060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档