【问题标题】:SQLite 'GROUP BY' query rounding strangelySQLite 'GROUP BY' 查询四舍五入奇怪
【发布时间】:2014-10-31 08:51:09
【问题描述】:

作为记录事件然后为用户绘制图表的应用程序的一部分,我正在运行一个过去 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 小时返回一次,以第一个小时命名。所以下午 4 点(16:00)到下午 6 点(18:00)的间隔应该被称为 16,而不是它在 17 点出来。

这是 SQLite 中 GROUP BY 的正常行为吗?我期望它按我想要的那样工作,是不是要求太多了?

提前致谢!

【问题讨论】:

    标签: android sql sqlite group-by


    【解决方案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
    

    【讨论】:

    • 非常感谢您的回答!请原谅我简化了显然是一个结构非常好的帖子,但是通过在原始小时执行“/2*2”操作,您可以确保 17 变为 16、14 仍然是 14、3变为 2 等,而不是您描述的“未定义”行为?
    • strftime("%H", ...) 将返回整数。 integer/integer 执行整数除法,例如,17/2=8。事实上,strftime("%H", ...)/2*2 会将小时舍入到更小的“2 小时”间隔。
    • 抱歉花了这么多时间回复,我现在才能够回到构建环境。您的解决方案效果很好,非常感谢:)!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2012-08-04
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多