如何在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




