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

Laravel下每日仅一行传感器数据最大最小值快速查询方法咨询

方案合理性判断

单独创建每日最大最小值汇总表是非常合理的方案,也是物联网时序类数据存储的常规优化手段,查询效率相比直接从30分钟粒度表聚合要高几十倍以上,尤其适合查询频率高、时间跨度大的场景。

具体实现方案

方案1:推荐方案-新增每日汇总表

  1. 表结构设计(仅参考,可根据需求扩展):
字段名类型说明
datedate日期,设为主键/唯一索引
day_maxfloat当日传感器最大值
day_minfloat当日传感器最小值
可选扩展字段/当日平均、统计时间等
  1. 数据同步逻辑:
    可以和你现有的30分钟粒度聚合任务联动,每天凌晨跑定时任务计算前一天的最大最小值写入即可;如果需要实时性,也可以在每次更新30分钟粒度表时,判断当前值是否超过每日表已存的最大/最小值,同步更新即可。

  2. Laravel查询代码示例:

// 假设每日汇总表对应的模型为SensorDailyStat
$startDay = '2021-01-01';
$endDay = '2021-01-31';

$dailyStats = SensorDailyStat::select('date', 'day_max', 'day_min')
    ->whereBetween('date', [$startDay, $endDay])
    ->get();

该方案不需要做任何聚合运算,直接走日期索引查询,性能最高。


方案2:不新增表,直接从现有30分钟粒度表查询

适合查询频率低、时间跨度小的场景,需要提前给Date字段加索引:
Laravel查询代码示例:

// 假设30分钟粒度表对应的模型为SensorAggregate30Min
$startDay = '2021-01-01';
$endDay = '2021-01-31';

$dailyStats = SensorAggregate30Min::selectRaw(
        'DATE(`Date`) as date, 
        MAX(`Maximum of the day`) as day_max, 
        MIN(`Minimum`) as day_min'
    )
    ->whereBetween('Date', [$startDay, $endDay.' 23:59:59'])
    ->groupByRaw('DATE(`Date`)')
    ->get();

注:因为你现有30分钟表中同日期的最大、最小值已经冗余为相同值,用MAX/MIN聚合和取任意一条的结果一致,不会出现逻辑错误。


内容的提问来源于stack exchange,提问作者Stefano Martini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:15:04