作为记录事件然后为用户绘制图表的应用程序的一部分,我正在运行一个查询,该查询运行到最近24小时,对记录进行分组(每2小时间隔一次),然后在表上显示它们(因此,将12条目)。
我正在使用的查询是动态生成的,但是我昨晚运行的一个查询示例如下:
Select strftime('%H', datetime(timestamp/1000, 'unixepoch')) AS Hour, COUNT(*) AS DateCount
FROM TableName
WHERE Timestamp >= 1414605600000 AND Timestamp < 1414692000000
GROUP BY (strftime('%H', datetime(timestamp/1000, 'unixepoch')) / 2)
ORDER BY timestamp ASC LIMIT 0,12
这样做是返回以2小时间隔分组的结果列表,以第一小时命名。例如,如果查询是在下午6:05运行的,则结果应为:
Hour | DateCount
----------------
18 | 3 records // Previous day
20 | 4 records // Previous day
22 | 2 records // Previous day
... pattern continues until the 4-6PM gap today...
16 | 3 records // Today
但是,实际上发生的是,第一个结果返回的小时数为7。实际上,该查询中的GROUP BY语句应该每隔2小时返回一次,以第一个小时命名。因此,应该将介于4PM(16:00)到6PM(18:00)的间隔称为16,但改为在17出现。
这是SQLite中GROUP BY的正常行为吗?我是否期望它能按我希望的那样工作呢?
提前致谢!
strftime('%H', datetime(timestamp/1000, 'unixepoch')) AS Hour
将返回小时,而不是您的“间隔名称”。您的分组子句使用类似Hour/2
这样的内容...
例如:
datetime hour hour/2
--------------------------------
17:00 17 8
17:30 17 8
16:00 16 8
16:30 16 8
如果这组结果,通过hour/2
,hour
在结果集可能是17
或16
,行为未定义。
但是,如果您创建一个hour interval
字段,则无法解决(并简化)查询:
Select strftime('%H', datetime(timestamp/1000, 'unixepoch'))/2*2 AS HourInterval, COUNT(*) AS DateCount
FROM TableName
WHERE Timestamp >= 1414605600000 AND Timestamp < 1414692000000
GROUP BY HourInterval
ORDER BY timestamp ASC LIMIT 0,12
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句