You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB高效查询weather_data表中rain_raw字段最后一次变更的对应时间戳

MariaDB高效查询weather_data表中rain_raw字段最后一次变更的对应时间戳

我完全懂你现在的痛点:之前用循环OFFSET的方式逐条往前查,不仅耗带宽,还把远程MariaDB服务器的CPU占满了,这种方法效率实在太低。咱们可以用MariaDB的窗口函数来一次性解决这个问题,不用再反复折腾了。

先直接给你最终的高效查询语句:

SELECT time, rain_raw 
FROM (
    SELECT time, rain_raw, LAG(rain_raw) OVER (ORDER BY time) AS lag_rain_raw 
    FROM weather_data
) t 
WHERE ROUND(rain_raw, 3) <> ROUND(lag_rain_raw, 3) 
ORDER BY time DESC 
LIMIT 1;

我给你拆解下这个语句的作用,为什么它比你之前的方法高效:

  • 内层子查询:用LAG(rain_raw) OVER (ORDER BY time)这个窗口函数,按照time从小到大的顺序,给每条记录绑定它前一条记录的rain_raw值(命名为lag_rain_raw)。因为你的time是主键且唯一有序,数据库可以直接利用主键索引来完成这个操作,不会做低效的全表扫描。
  • 处理浮点数精度问题:外层用ROUND(rain_raw, 3) <> ROUND(lag_rain_raw, 3)来筛选变化记录。这是因为浮点数在存储时可能存在微小的精度差异(比如看起来都是23.6529,实际二进制存储值可能略有不同),直接用<>判断会误判,统一四舍五入到3位小数后再比较,就能精准匹配你数据的实际变化。
  • 取最后一次变更:把所有找到的变更记录按time从新到旧排序,取第一条,就是你要的最后一次rain_raw发生变化的时间戳和对应值。

这个方法只需要和远程数据库交互一次,不用反复发送查询请求,带宽和CPU占用都会大幅降低,而且数据库能通过索引优化查询速度,效率比你之前的循环方法高太多。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:46:00