fix:修改了聚合查询
This commit is contained in:
parent
2be5f5212a
commit
ffc5278e52
@ -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
|
||||||
|
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
|
SELECT
|
||||||
DATE_FORMAT(MIN(timestamp), '%Y-%m-%dT%H:%i:%S') as ts,
|
bucket_time,
|
||||||
ROUND(AVG(temperature)/10, 1) as avg_temp,
|
ROUND(temp/10, 1) AS avg_temp,
|
||||||
MAX(rainfall) - MIN(rainfall) as rainfall,
|
rain AS rainfall,
|
||||||
ROUND(AVG(humidity)/10, 1) as avg_humidity,
|
ROUND(hum/10, 1) AS avg_humidity,
|
||||||
ROUND(AVG(wind_speed)/10, 1) as avg_wind_speed
|
ROUND(wind/10, 1) AS avg_wind_speed
|
||||||
FROM sensor_data
|
FROM time_buckets
|
||||||
WHERE timestamp BETWEEN ? AND ?
|
ORDER BY bucket_time DESC
|
||||||
GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp)/?)
|
|
||||||
ORDER BY ts 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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user