2013-12-23 2 views
0

Фоновая информация: Я работаю над небольшим частным клоном pingdom.com.Группа mysql результаты по типу - но только в определенном порядке

У меня есть таблица со статусом, если сайт доступен или нет, и дата проверки курса. Некоторые из них имеют статус «нормально», некоторые «не в порядке». Теперь я хочу сгруппировать строки по статусу, но только тот, который находится в одном и том же «таймфрейме».

Пример:

id status timestamp 
1 ok  1234 
2 ok  1235 
3 not ok 1236 
4 ok  1237 

Запрос должен сделать три группы с идентификаторами 1-2, 3 и 4. В конце концов, я хочу сделать дисплей, что тестируемый сайт был 2 часа в сутки, 1 час в автономном режиме и затем 1 час онлайн снова. Конечно, я мог бы фильтровать результаты позже, но я думал, что это будет очень неэффективно с большим набором данных.

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

ответ

1

Попробуйте этот запрос:

SELECT min(timestamp) from_timestamp, 
     max(timestamp) to_timestamp, 
     max(timestamp) - min(timestamp) + 1 how_long, 
     min(id) from_id, 
     max(id) to_id, 
     status 
FROM (
    SELECT t.id, 
      t.timestamp, 
      if(@last_status = status, @group, @group:[email protected]+1) group_number, 
      @last_status := status as status 
    FROM table1 t 
    CROSS JOIN (
     SELECT @last_status := null, @group:=0 
    ) as init_vars 
    ORDER BY t.timestamp 
) q 
GROUP BY group_number 
ORDER BY from_timestamp 

демо: ->http://www.sqlfiddle.com/#!2/2aa1e/10

+0

Действительно здорово! Я думаю, мне может понадобиться некоторое время для его реализации, но демонстрация работает, так что спасибо! – Tim

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