我的目标是创建一个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中的一些小帖子处理也是可能的。
答案 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,您可以获得所有间隔......