2017-02-08 10 views
0

У меня есть таблица, как это, который состоит из нескольких климатических мер (ставка дождя, темпов и т.д.)SQL-запрос, чтобы получить AVG из столбцов и GROUP BY

mysql> select rain_rate, temperature, datetime from weather limit 10; 
+--------------+---------------+----------------------+ 
| rain_rate | temperature | datetime    | 
+--------------+---------------+----------------------+ 
| 5.0000000000 | 24.4000000000 | 2017-02-08 16:00:56 | 
| 1.0000000000 | 22.4000000000 | 2017-02-06 12:10:36 | 
| 2.0000000000 | 28.7000000000 | 2017-02-02 13:57:15 | 
| 5.0000000000 | 24.7000000000 | 2017-02-01 14:14:16 | 
| 1.0000000000 | 16.1000000000 | 2017-01-08 06:01:26 | 
| 2.0000000000 | 18.2000000000 | 2017-01-12 05:10:43 | 
| 3.0000000000 | 11.9000000000 | 2017-01-10 06:20:54 | 
| 4.0000000000 | 16.8000000000 | 2017-01-25 16:10:14 | 
| 5.0000000000 | 24.4000000000 | 2016-12-18 23:10:56 | 
| 4.0000000000 | 26.6000000000 | 2016-12-30 09:03:54 | 
... 

Как можно видеть, временные метки (DateTime поля) не следует никакой схеме.

Я хочу, чтобы получить последний 24 средние значения температуры и rain_rate на час, а столбец с численным значением соответствующего часа, в 24-часовом формате, заказанного час возрастанию.

В качестве примера, если я выполнил запрос сегодня в 18:30, он должен вернуть эти 24 строки:

+-----------------+------------------+-------+ 
| avg(rain_rate) | avg(temperature) | hour | 
+-----------------+------------------+-------+ 
| 3.5000000000 | 23.1000000000 | 19 | | 
| 1.0000000000 | 22.6000000000 | 20 | | 
| 3.5000000000 | 24.7000000000 | 21 | |-> hours of "yesterday" 
| 4.5000000000 | 23.8000000000 | 22 | | 
        ... 
| 2.0000000000 | 26.3000000000 | 13 | | 
| 1.5000000000 | 21.6000000000 | 14 | | 
| 7.0000000000 | 23.4000000000 | 15 | |-> hours of "today" 
| 2.5000000000 | 21.4000000000 | 16 | | 
| 7.0000000000 | 21.2000000000 | 17 | | 
| 3.0000000000 | 25.3000000000 | 18 | | 

Мой лучший попробовать до сих пор:

select avg(rain_rate), avg(temperature), hour(datetime) as hour 
from weather 
where (datetime >= now() - interval 24 hour) 
group by hour(datetime) 
order by max(datetime) asc 

Похоже этот запрос возвращает правильные средние значения для полей, но час Поле не представляется упорядоченным, как мне нужно, и не соответствует средним значениям ...

Любая помощь очень ценится. Спасибо заранее.

+1

В запросе вы заказываете 'max (datetime)' вместо 'hour (datetime)' – dnoeth

+0

LIMIT 10, так что нет эллипсиса ;-) – Strawberry

+0

Если я заказываю * час (datetime) *, всегда получаю столбцы из От 0 до 23 (часов), что не то, что я хочу ... – andcl

ответ

3

Вы хотите усреднить по часам в течение последних 24 часов.

Хорошо. Вот один из способов:

select date(datetime), hour(datetime), 
     avg(rain_rate), avg(temperature) 
from weather 
where (datetime >= now() - interval 24 hour) 
group by date(datetime), hour(datetime) 
order by min(datetime); 

Примечание: 24 часа с текущего времени могут быть немного странными. Вы можете получить 25 строк записей (с двумя частичными часами). Вы можете это where:

where datetime < curdate() + interval hour(now()) hour and 
     datetime >= curdate() + interval hour(now()) - 24 hour 
+1

@ spencer7593. , , Это тоже разумно. Однако неявное упорядочение в 'group by' устарело с MySQL 5.6. Если вы собираетесь использовать явный синтаксис, также можете использовать форму, согласованную между базами данных. –

+1

Я не предлагал исключить предложение 'ORDER BY'; Я предлагаю, чтобы выражения в 'ORDER BY' были теми же выражениями, которые использовались в' GROUP BY'. +10. почему бы не просто упорядочить те же выражения в GROUP BY? (Хороший улов на границе часа, включает строки из 25 отдельных периодов времени и группировку самого раннего и последнего часа в одну строку.) И 'GROUP BY DATE_FORMAT (datetime, '% Y-% m-% d% h') ORDER BY DATE_FORMAT (datetime, '% Y-% m-% d% h') 'будет работать тоже. – spencer7593

+0

Хорошо, спасибо @ gordon-linoff. Но ... Как бы вы обновили его, чтобы получить среднее значение за последнюю неделю (т. Е. 7 дней)? – andcl

0

Я полагаю, вы должны попробовать order by datetime.

Запрос должен быть как:

select avg(rain_rate), avg(temperature), hour(datetime) as hour 
from weather 
where (datetime >= now() - interval 24 hour) 
group by hour(datetime) 
order by datetime asc; 

Я надеюсь, что я была помощь.

 Смежные вопросы

  • Нет связанных вопросов^_^