как получать среднее значение каждые 2 часа в sql-запросе?

#sql

#sql

Вопрос:

 $query= SELECT channel1, channel2, channel3
FROM `Table`
WHERE `id` =1
AND `dateTime` >= '2011-10-15 00:00:01'
AND `dateTime` <= '2011-10-17 23:59:59'
  

На основе приведенного выше запроса, как получать среднее значение столбцов channel1, channel2, channel3 каждые 2 часа?

Ответ №1:

Вот решение tsql:

 SELECT avg(channel1) channel 1, avg(channel2) channel2, avg(channel3) channel3, 
       dateadd(hour, datediff(hour, 0,datetime)/2*2,0) FROM Table 
WHERE id =1 AND 
dateTime >= '2011-10-15 00:00:01' AND 
dateTime <= '2011-10-17 23:59:59' 
group by datediff(hour, 0,datetime)/2*2
  

Комментарии:

1. Спасибо @t-clausen.dk. Это запрос для sql server? Я использовал mysql версии 5.1.35, есть некоторая синтаксическая ошибка.

Ответ №2:

Предполагая, что MySQL:

 SELECT date(`dateTime`) dateDay, 2*floor(date_format(`dateTime`,'%H')/2) dateHour,
       avg(channel1), avg(channel2), avg(channel3)
FROM `Table`
WHERE `id` =1
AND `dateTime` >= '2011-10-15 00:00:01'
AND `dateTime` <= '2011-10-17 23:59:59'
group by date(`dateTime`), 2*floor(date_format(`dateTime`,'%H')/2)
  

Ответ №3:

Ключом к этому запросу является группирование записей каждые два часа.

Рассмотрим:

floor = функция, которая возвращает наибольшее целое значение, равное или меньшее числа (найдите похожее в вашей базе данных)

time_hh = ваш столбец DateTime в формате ‘ччммм’, я имею в виду, от ‘0000’ до ’23:59′ (отформатируйте ваше поле DateTime с помощью ваших функций базы данных)

Запрос будет:

 SELECT 
  floor( time_hh / 200 ), 
  min(datetime), 
  max(datetime), 
  avg(channel1), 
  avg(channel2), 
  avg(channel3)
FROM 
  `table`
GROUP BY
  floor( time_hh / 200 )