mySql 获取范围内的 N 条记录

问题描述 投票:0回答:1

我有数据记录器大约以 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年的问题。

mysql select limit
1个回答
0
投票

这可以通过单个查询来完成。首先,创建一个整数表(这在许多查询中很有用)。像这样就好了:

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
© www.soinside.com 2019 - 2024. All rights reserved.