我有数据记录器大约以 5 秒的间隔获取温度(有时数据丢失,例如 MQTT QoS 0)。每个样本都存储在带有时间戳的数据库中。这意味着每天 14400 条记录。
现在我想在基于 arduino 的简单显示器中以小内存显示图形结果。如果我想显示每周图表,这意味着有 100800 条记录,当然我没有记忆力。
那么是否有可能获得例如从开始时间戳到结束时间戳线性间隔的 N 条记录。选取每个 x 个样本并不是一个好的选择,因为每 5 秒的记录并不精确。它可能只是最接近间隔的样本,但我更喜欢是否可以获得间隔的平均值。
例如我已经记录了10周。现在我想显示过去一周只有 7 条记录(每天一条),并且我希望获得每天的平均值作为结果。这可能吗?
另一个例子是我想要上一小时的一分钟平均值。 (在一个查询中!)
我用谷歌搜索但找不到解决方案。
附注 当前(工作)解决方案是:
SELECT AVG(`sVal`), id, `timestamp` FROM `Test` WHERE sKey='U1' AND timestamp between '2023-08-01 00:00:00' and '2023-08-30 23:59:00' GROUP BY FLOOR(UNIX_TIMESTAMP(`timestamp`)/86400)
...但恐怕不太容易出现linux时间戳2038年的问题。
这可以通过单个查询来完成。首先,创建一个整数表(这在许多查询中很有用)。像这样就好了:
create table integers (
i integer not null primary key
)
对于此查询,您只需使用 0 到 6 之间的整数填充即可。
为了测试您的读数,我创建了一个如下表:
create table readings (
ts timestamp not null primary key,
reading float not null
)
使用这两个表,此查询将提取自 2023 年 8 月 1 日开始一周的每日平均值:
with daterange as (
select date_add('2023-08-01 00:00:00', interval (i.i) day) as ts from
integers i
where i between 0 and 6
)
select daterange.ts, avg(reading) from readings r join daterange on r.ts between daterange.ts and date_add(daterange.ts, interval 1 day)
group by daterange.ts