2015-09-06 3 views
1

У меня есть таблица, table_1, который имеет данные за каждую минуту и ​​выглядит как:агрегирование MySQL данные минутных-накрест необработанных данных

+---------------------+---------+ 
| date_time   | value | 
+---------------------+---------+ 
| 2015-06-05 18:00:00 | 222.663 | 
| 2015-06-05 18:01:00 | 222.749 | 
| 2015-06-05 18:02:00 | 222.957 | 
| 2015-06-05 18:03:00 | 223.063 | 
| 2015-06-05 18:04:00 | 223.117 | 
+---------------------+---------+ 

Я хочу получать минимальные и максимальные значения для каждого 15-минутного интервала (или любой другой интервал, настраиваемый). Желаемый результат:

+---------------------+---------+ 
| date_time   | value | 
+---------------------+---------+ 
| 2015-06-05 18:10:00 | 200.663 | (min between 18:00 and 18:14) 
| 2015-06-05 18:13:00 | 222.749 | (max between 18:00 and 18:14) 
| 2015-06-05 18:17:00 | 190.957 | (min between 18:15 and 18:29) 
| 2015-06-05 18:33:00 | 400.063 | (max between 18:15 and 18:29) 
+---------------------+---------+ 

настоящее время я использую следующее решение:

select date_time, value 
    from table_1, 
     (select date_time h, 
       min(value) min, max(value) max 
       from table_1 where date_time >= '2015-06-05 18:00:00' and date_time < '2015-06-05 19:00:00' 
      group by round(unix_timestamp(date_time)/(15 * 60)) 
     ) t 
    where value in (min, max) 
    and date_time = h 

Решение основано на: Aggregating MySQL data on hourly basis from minute-wise raw data

Однако нынешнее решение дает мне только два значения (один мин и один максимум). Я хочу иметь ВСЕ значения min и max из ВСЕХ 15-минутных интервалов, как показано на примере выше.

+1

Почему вы не хотите думать, по крайней мере, два minitutes? :(выберите дата_время, значение из t1, (выбрать круглую (UNIX_TIMESTAMP (DATE_TIME)/(15 * 60)) ч, мин (значение) мин, макс (значение) макс от t1 группы по ч ) т где значение в (мин, макс.) и round (unix_timestamp (date_time)/(15 * 60)) = h – splash58

+0

@ splash58 sorry mate, я все еще новичок и не смог найти правильное решение. решение. BTW, я заменил round() на floor(). – luvlogic

+0

floor is good :) – splash58

ответ

1

это общий результат с автором вопроса :)

select date_time, value 
    from t1, 
     (select floor(unix_timestamp(date_time)/(15 * 60)) h, 
       min(value) min, max(value) max 
       from t1 
      group by h 
     ) t 
    where value in (min, max) 
    and floor(unix_timestamp(date_time)/(15 * 60)) = h 
+0

Жаль, что вы боль. Если есть несколько значений, которые совпадают с максимальным (или минимальным) значением в интервале, сообщается ВСЕ их. Я хочу только одно максимальное и одно минимальное значение в интервале. Я попытался установить ограничение в запросе select, но это работает неправильно. – luvlogic

+0

Я написал об этом в своем 1-м ответе. Когда вы находитесь рядом с comp, напишите – splash58

+1

@luvlogic add tail: 'group by floor (unix_timestamp (date_time)/(15 * 60)), value'. – splash58

1

Следующий фрагмент кода дает максимум и минимум для каждого интервала 15 минут. Вы можете заменить 15 на любое целое число, которое отлично делит 60.

select b.date_time,b.value 
from 
table_1 b 
join (select min(a.value) minv, max(a.value) maxv, date_sub(a.date_time,INTERVAL second(a.date_time)+ 
       (minute(a.date_time)-minute(a.date_time) div 15) 
       *60 second) partition_interval 
from table_1 a 
group by partition_interval) temp 
on temp.partition_interval=date_sub(b.date_time,INTERVAL second(b.date_time)+ 
       (minute(b.date_time)-minute(b.date_time) div 15) 
       *60 second) 
       and b.value in(temp.minv,temp.maxv) 
group by temp.partition_interval,b.value 

Код Edit 1: Заменено @date_time по date_time

Код дает результат в соответствии с ожиданием.

Просьба проверить на http://sqlfiddle.com/#!9/bd668/16

+0

Спасибо за помощь. Однако код возвращает только один набор значений. Мне нужны значения для каждого интервала. – luvlogic

+0

@luvlogic: он даст данные (1 строка) для каждого интервала, если данные существуют по крайней мере в одной строке в конкретном интервале. – seahawk

+0

@luvlogic: Я сожалею о задержке в ответе. Я обновил код. путем замены '@ date_time' на' date_time'. – seahawk

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