From ffc5278e523a08d2cb73f121773dc3c5de9e0f21 Mon Sep 17 00:00:00 2001 From: fengyarnom Date: Thu, 15 May 2025 17:32:51 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E8=81=9A=E5=90=88=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/dao/sensor.go | 43 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/internal/dao/sensor.go b/internal/dao/sensor.go index c22ba59..f487526 100644 --- a/internal/dao/sensor.go +++ b/internal/dao/sensor.go @@ -44,42 +44,47 @@ func (dao *SensorDAO) Insert(data *model.SensorData) error { func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ([]model.AggregatedData, error) { // 参数化时间间隔 var intervalMinutes int - var timeFormat string switch interval { case "5min": intervalMinutes = 5 - timeFormat = "%Y-%m-%dT%H:%i:00" case "30min": intervalMinutes = 30 - timeFormat = "%Y-%m-%dT%H:%i:00" default: // 1hour intervalMinutes = 60 - timeFormat = "%Y-%m-%dT%H:00:00" } - // 计算秒数 - intervalSeconds := intervalMinutes * 60 - - // 构建通用查询 + // 使用子查询和时间桶来实现聚合 query := ` + WITH time_buckets AS ( + SELECT + DATE_FORMAT( + DATE_SUB(timestamp, INTERVAL MOD(MINUTE(timestamp), ?) MINUTE), + '%Y-%m-%dT%H:%i:00' + ) AS bucket_time, + AVG(temperature) AS temp, + MAX(rainfall) - MIN(rainfall) AS rain, + AVG(humidity) AS hum, + AVG(wind_speed) AS wind + FROM sensor_data + WHERE timestamp BETWEEN ? AND ? + GROUP BY bucket_time + ) SELECT - DATE_FORMAT(MIN(timestamp), '%Y-%m-%dT%H:%i:%S') as ts, - ROUND(AVG(temperature)/10, 1) as avg_temp, - MAX(rainfall) - MIN(rainfall) as rainfall, - ROUND(AVG(humidity)/10, 1) as avg_humidity, - ROUND(AVG(wind_speed)/10, 1) as avg_wind_speed - FROM sensor_data - WHERE timestamp BETWEEN ? AND ? - GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp)/?) - ORDER BY ts DESC + bucket_time, + ROUND(temp/10, 1) AS avg_temp, + rain AS rainfall, + ROUND(hum/10, 1) AS avg_humidity, + ROUND(wind/10, 1) AS avg_wind_speed + FROM time_buckets + ORDER BY bucket_time DESC ` // 执行查询 rows, err := dao.db.Query( query, - start, end, // 时间范围 - intervalSeconds, // GROUP BY参数 + intervalMinutes, // 时间桶参数 + start, end // 时间范围 ) if err != nil {