作为记录事件然后为用户绘制图表的应用程序的一部分,我正在运行一个在过去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
这样做会返回按小时间隔分组的结果列表,以第一个小时的名字命名。例如,如果查询是在下午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小时返回一次,以第一个小时命名。所以下午4点(16点)到下午6点(18点)的间隔应该叫做16,而不是17点。
这是SQLite中GROUP BY的正常行为吗?我是否希望按照我的要求工作,对此提出太多要求?
提前致谢!
答案 0 :(得分:1)
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