SQLite'GROUP BY'查询奇怪地舍入

时间:2014-10-31 08:51:10

标签: android sql sqlite group-by

作为记录事件然后为用户绘制图表的应用程序的一部分,我正在运行一个在过去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的正常行为吗?我是否希望按照我的要求工作,对此提出太多要求?

提前致谢!

1 个答案:

答案 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可能为1716,行为未定义。

但是,如果您创建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