#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 )