5

我有一个简单的 SQLite 表,可以全天记录能源消耗。它看起来像这样:

rowid       amrid       timestamp   value     
----------  ----------  ----------  ----------
1           1           1372434068  5720      
2           2           1372434075  0         
3           3           1372434075  90        
4           1           1372434078  5800      
5           2           1372434085  0         
6           3           1372434085  95

我想通过每 10 分钟获取最接近的值来构建最后一天消耗的简化历史记录,以构建如下所示的 CSV:

date              value
----------------  ---------- 
2013-07-01 00:00          90
2013-07-01 00:10         100
2013-07-01 00:20         145          

至于现在,我有一个请求,允许我获取一个时间戳的最接近值:

SELECT *
FROM indexes
WHERE amrid=3
ORDER BY ABS(timestamp - strftime('%s','2013-07-01 00:20:00'))
LIMIT 1;

我如何构建一个可以一整天都得到它的请求?谢谢,

4

1 回答 1

3

让我将“最接近的值”定义为每 10 分钟间隔开始后的第一个值。您可以将这个想法推广到其他定义,但我认为这是最容易解释这个想法的。

将时间戳转换为“yyyy-mm-dd hhMM”形式的字符串值。该字符串长度为 15 个字符。10 分钟间隔将是前 14 个字符。因此,使用它作为聚合键,计算min(id)并使用它连接回原始数据。

这是想法:

select isum.*
from indexes i join
     (select substr(strftime('%Y-%m-%d %H%M', timestamp), 1, 14) as yyyymmddhhm,
             min(id) as whichid
      from indexes
      group by substr(strftime('%Y-%m-%d %H%M', timestamp), 1, 14)
     ) isum
     on i.id = isum.whichid
于 2013-07-01T16:21:59.563 回答