You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在SQL BETWEEN查询中使用时间戳最新记录?双Arduino湿度数据求平均

解决两台Arduino湿度数据的平均值计算与时间范围查询问题

嘿,我来帮你搞定这个Arduino数据统计的问题~先提个小细节:你的humidity表里存湿度的字段是degree,但你写的SQL里用了setPercent,这应该是手滑写错啦,先纠正过来哈。接下来咱们分步骤解决你的核心需求:

1. 搞定“用最新时间戳做BETWEEN查询范围”的问题

你需要的是基于最新的记录时间来划定查询范围,这里分几种场景给你方案:

场景一:查最新记录往前一段时间内的所有数据(比如最近5分钟)

如果两台Arduino是持续上传数据,你想统计最近一小段时间内的平均湿度,可以先拿到最新的时间戳,再往前推时间范围:

-- 先把最新的记录时间存到变量里
SELECT MAX(setTime) INTO @latest_time FROM humidity;

-- 然后查这个时间点往前5分钟内的湿度平均值,INTERVAL后面的数值可以按需调整
SELECT AVG(degree) AS humidav
FROM humidity
WHERE setTime BETWEEN DATE_SUB(@latest_time, INTERVAL 5 MINUTE) AND @latest_time;

场景二:直接取两台设备的最新上传数据计算平均

如果你的两台Arduino是交替或者几乎同时上传数据,最新的两条记录正好对应两台设备的最新数据,那直接取这两条算平均就好:

SELECT AVG(degree) AS humidav
FROM (
    -- 先按时间倒序取最新的两条记录
    SELECT degree
    FROM humidity
    ORDER BY setTime DESC
    LIMIT 2
) AS latest_two_readings;

场景三:给表加个设备ID,长期统计更靠谱

目前你的表没区分是哪台Arduino传的数据,万一某台设备上传了多条、另一台没传,算出来的平均值就不准啦。建议给humidity表加个device_id字段(比如用1和2分别标记两台设备),这样就能精准拿到每台设备的最新数据再算平均:

-- 先给表加设备ID字段(如果还没加的话)
ALTER TABLE humidity ADD COLUMN device_id INT NOT NULL;

-- 然后查询每台设备的最新湿度,再算平均值
SELECT AVG(degree) AS humidav
FROM (
    SELECT degree
    FROM humidity
    WHERE device_id IN (1, 2)
    GROUP BY device_id
    HAVING setTime = MAX(setTime)
) AS latest_per_device;

2. 适配你的Arduino上传场景小提示

记得让两台Arduino上传数据时,setTime字段的时间戳要准确——可以让Arduino获取当前时间,或者让USB宽带棒同步好时间再写入数据库,还要注意数据库的时区和设备的时区一致,避免时间偏差导致查询范围出错哦。


内容的提问来源于stack exchange,提问作者Theodore Flores

火山引擎 最新活动