2012-04-17 2 views
0

Учитывая данные примера ниже, как я могу получить только одну строку за каждую минуту time?Группа Mysql по времени имеет мутиловое состояние

я тогда нужно сделать условие так:

SELECT IF (`Flag` IS NOT NULL, 
      [fetch flag row], 
      [otherwise fetch one row from that minute]); 

Примеры данных

ID Rate Flag  time 
1 68.65 null  2012-04-18 10.00.01 
2 68.63 null  2012-04-18 10.00.11 
3 68.68 null  2012-04-18 10.00.21 
4 68.70 null  2012-04-18 10.00.31 
5 68.71 null  2012-04-18 10.00.41 
6 68.60 null  2012-04-18 10.00.51 
7 68.64 null  2012-04-18 10.01.01 
8 68.75 null  2012-04-18 10.01.11 
9 68.72 1   2012-04-18 10.01.21 
10 68.63 null  2012-04-18 10.01.31 
11 68.62 null  2012-04-18 10.01.41 
12 68.60 null  2012-04-18 10.01.51 

Expected Output 
1 68.65 null  2012-04-18 10.00.01 
9 68.72 1   2012-04-18 10.01.21 

Это то, что я получил до сих пор:

SELECT FLAG as signal, DATE_FORMAT(TIME, '%Y-%m-%d %H:%i') as time, RATE as rate 
     FROM RATES WHERE (FLAG!='' || (DATE_FORMAT(TIME, '%s')>50)) 
    GROUP BY time 
    ORDER BY time DESC,FLAG DESC; 

Спасибо за ваш Помогите.

Нихилу

+0

флаг выбора в качестве сигнала, DATE_FORMAT (TIME, '% Y-% m-% d% H:% I'), как время, скорость, как стоимость от такой скорости, (ФЛАГ ! = '' || (DATE_FORMAT (TIME, '% s')> 50)) GROUP BY time ORDER BY time DESC, FLAG DESC – user1340004

ответ

0

Ваша проблема может быть описана следующим образом: найти строку с максимальным флагом в каждом наборе строк, сгруппированных по одной и той же минуты, выбрать любой, если более чем один ряд имеет тот же флаг. Таким образом, запрос должен выглядеть следующим образом:

SELECT r.id, r.rate, rg.flag, rg.minute 
FROM 
    (SELECT MAX(flag) as flag , DATE_FORMAT(`TIME`, '%Y-%m-%d %H:%i') as minute 
    FROM RATES 
    GROUP BY minute) rg 
JOIN RATES r 
ON r.id =(SELECT ru.id FROM RATES ru 
      WHERE ru.flag <=> rg.flag 
      AND ru.time BETWEEN CONCAT(rg.minute,':00') AND CONCAT(rg.minute,':59') 
      LIMIT 1) 
+0

Это хорошо, но у меня огромные записи в моей таблице, этот запрос займет длительное выполнение , – user1340004

+0

Он уверен, что будет медленным на большой таблице из-за группировки на некоторое производное значение вместо столбца из таблицы, что делает невозможным использование индекса для группировки. Вы можете попробовать добавить столбец datetime со временем, приближенным к полным минутам, и использовать его для группировки и соединения, это будет намного быстрее с индексом. Но на действительно огромной столе было бы лучше отмечать отдельные строки каждую минуту. Как именно вы отмечаете их прямо сейчас? Вы добавляете флаги вручную? – piotrm

+0

Таблица обновляет строки каждые 5 секунд, и мы не устанавливаем флаг вручную, флаг не является частым, когда он может произойти один или два раза в час. – user1340004

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