用于按空帧分组的SQL

时间:2014-10-27 23:21:50

标签: php mysql time grouping

我的目标是创建一个SQL查询,计算特定时间范围内的所有项目(例如5分钟)

到目前为止,这是我的代码:

SELECT FROM_UNIXTIME(FLOOR(timestamp_stop/5*60)*(5*60), '%h:%i') AS timekey, timestamp_stop, count(item) AS performance
FROM task
WHERE done = 1
GROUP BY timekey
ORDER BY timestamp_stop ASC

效果很好,但不包括数据库中没有任何记录的时间范围。 我想得到这些0计数的,直到当前时间。

目前我脑子里没有简单/优雅的解决方案。有什么想法吗?

php中的一些小帖子处理也是可能的。

2 个答案:

答案 0 :(得分:0)

如果有这样的时间范围,但where子句过滤掉记录,您可以这样做:

SELECT FROM_UNIXTIME(FLOOR(timestamp_stop/5*60)*(5*60), '%h:%i') AS timekey,
       timestamp_stop,
       sum(item is not null and done = 1) AS performance
FROM task
GROUP BY timekey
ORDER BY timestamp_stop ASC;

如果仍有间隙,则需要生成一个包含所需时间列表的表(或子查询)并使用left join

编辑:

子查询不愉快。您必须列出所有时间值。类似的东西:

SELECT q.timekey, t.timestamp_stop, coalesce(t.performance, 0) as performance
FROM (SELECT '00:00' as timekey UNION ALL
      SELECT '00:05' UNION ALL
      . . .
     ) q LEFT JOIN
     (SELECT FROM_UNIXTIME(FLOOR(timestamp_stop/5*60)*(5*60), '%h:%i') AS timekey,
             timestamp_stop, 
             COUNT(item) AS performance
      FROM task
      WHERE done = 1
      GROUP BY timekey
     ) t
     ON t.timekey = q.timekey
ORDER BY timestamp_stop ASC;

答案 1 :(得分:0)

正如戈登所说,你可能想要一张二级桌作为所有5分钟间隔的基础。我使用MySQL变量进行了自我构建的查询。

select
      YourTable.WhateverFields
   from
      ( select
             @startTime RangeStart,
             @startTime := date_add( @startTime, interval 5 MINUTE ) RangeEnd
           from 
              ( select @startTime := '2014-10-20' ) sqlvars,
              AnyTableThatHasAsManyDaysYouExpectToReport
           limit
              12 * numberOfHoursYouNeed * numberOfDaysYouNeed ) DynamicTimeRange
         LEFT JOIN YourTable
            on YourTable.DateTimeField >= DynamicTimeRange.RangeStart
           AND YourTable.DateTimeField < DynamicTimeRange.RangeEnd

因此,在此示例中,最里面的变量将“startTime”判定为2014年10月20日,默认为12:00:00。然后从那里创建一个RangeStart和RangeEnd的两列结果集,可能看起来像......

RangeStart          RangeEnd
2014-10-20 00:00    2014-10-20 00:05
2014-10-20 05:00    2014-10-20 00:10
2014-10-20 10:00    2014-10-20 00:15
2014-10-20 05:00    2014-10-20 00:20
2014-10-20 20:00    2014-10-20 00:25

表格引用“AnyTableThatHasAsManyDaysYouExpectToReport”只是...数据库中的任何一个表,其中至少有足够多的记录来生成5分钟的间隔,无论多少小时和几天。如果您需要1天值= 12条记录* 5分钟= 1小时* 24小时= 24 * 12 =需要288条记录。如果你想要一个星期,那就这样吧......乘以7,这样我的样本就有了占位符来帮助澄清意图......

但是通过LEFT JOIN,您可以获得所有间隔......