2014-10-27 63 views
0

我的目标是创建一个SQL查询计数在一定的时间范围内的所有物品(如5分钟)SQL进行分组按时间范围与空帧

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

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中的一些小后处理也是可能的。

回答

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; 
+0

谢谢!差距不是由于where子句,而是由于缺少任何条目。一个具有所有时间框架的子查询怎么可能是?带额外桌子的营养不是很优雅,因为我想看到所有的时间框架到现在或某个时间点。 – tobawo 2014-10-27 23:39:48

0

正如Gordon提到的,您可能需要一个辅助表作为所有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,您可以获得所有间隔.. 。