fix:修改了聚合查询

This commit is contained in:
fengyarnom 2025-05-15 17:32:51 +08:00
parent 2be5f5212a
commit ffc5278e52

View File

@ -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) { func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ([]model.AggregatedData, error) {
// 参数化时间间隔 // 参数化时间间隔
var intervalMinutes int var intervalMinutes int
var timeFormat string
switch interval { switch interval {
case "5min": case "5min":
intervalMinutes = 5 intervalMinutes = 5
timeFormat = "%Y-%m-%dT%H:%i:00"
case "30min": case "30min":
intervalMinutes = 30 intervalMinutes = 30
timeFormat = "%Y-%m-%dT%H:%i:00"
default: // 1hour default: // 1hour
intervalMinutes = 60 intervalMinutes = 60
timeFormat = "%Y-%m-%dT%H:00:00"
} }
// 计算秒数 // 使用子查询和时间桶来实现聚合
intervalSeconds := intervalMinutes * 60
// 构建通用查询
query := ` query := `
WITH time_buckets AS (
SELECT SELECT
DATE_FORMAT(MIN(timestamp), '%Y-%m-%dT%H:%i:%S') as ts, DATE_FORMAT(
ROUND(AVG(temperature)/10, 1) as avg_temp, DATE_SUB(timestamp, INTERVAL MOD(MINUTE(timestamp), ?) MINUTE),
MAX(rainfall) - MIN(rainfall) as rainfall, '%Y-%m-%dT%H:%i:00'
ROUND(AVG(humidity)/10, 1) as avg_humidity, ) AS bucket_time,
ROUND(AVG(wind_speed)/10, 1) as avg_wind_speed AVG(temperature) AS temp,
MAX(rainfall) - MIN(rainfall) AS rain,
AVG(humidity) AS hum,
AVG(wind_speed) AS wind
FROM sensor_data FROM sensor_data
WHERE timestamp BETWEEN ? AND ? WHERE timestamp BETWEEN ? AND ?
GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp)/?) GROUP BY bucket_time
ORDER BY ts DESC )
SELECT
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( rows, err := dao.db.Query(
query, query,
start, end, // 时间范围 intervalMinutes, // 时间桶参数
intervalSeconds, // GROUP BY参数 start, end // 时间范围
) )
if err != nil { if err != nil {