SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.07.2012 16:49:57

serious_shat
Участник
Зарегистрирован: 04.07.2012
Сообщений: 2

Запрос для подсчета длительности инцидентов.

Добрый день.
В БД MySQL, есть таблица с информацией о смене статуса объекта, с "problem" или "unknown" в "ok" и обратно:
eventid | objectid | clock       | value
1         1          1341389857     problem
2         1          1341389867     ok
3         1          1341389882     unknown
4         1          1341389904     ok
5         1          1341389927     problem
...

где, eventid - номер события, objectid - идентификатор объекта по которому зарегистрировано событие, clock - время (формат unixtime).

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

Запрос должен отбирать записи в таблице за последний час, по очереди брать значение ячейки clock где value = ok, отнимать значение сlock c value = problem или unknown и переходить к следущему событию с value = ok (например, длительность события с eventid 1 = 10 секунд, с eventid 3 = 22 сек. и т.д.), потом сумировать полученные значения.

Неактивен

 

#2 04.07.2012 22:52:57

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Запрос для подсчета длительности инцидентов.

Можно так :

select a.eventid,a.objectid,a.`interval` from (
select
@prev_clock,
@prev_value,
l.*,
if(l.value='ok' && @prev_value!='ok' && @prev_objectid=l.objectid,TIMEDIFF(FROM_UNIXTIME(l.clock),FROM_UNIXTIME(@prev_clock)),0) 'interval',
(@prev_clock:=l.clock),(@prev_value:=l.value),(@prev_objectid:=l.objectid)
from log l,(select @vclock:=0,@prev_value:='',@prev_objectid:=0) b1
where l.clock>UNIX_TIMESTAMP(now()-interval 1 hour)
order by l.objectid,l.eventid
) a where a.value='ok'


Результат будет:

eventid    objectid    interval
2            1           00:00:10
4            1           00:00:22


select a.objectid,SEC_TO_TIME(sum(SECOND(a.interval))) 'total_time' from (
select
@prev_clock,
@prev_value,
l.*,
if(l.value='ok' && @prev_value!='ok' && @prev_objectid=l.objectid,TIMEDIFF(FROM_UNIXTIME(l.clock),FROM_UNIXTIME(@prev_clock)),0) 'interval',
(@prev_clock:=l.clock),(@prev_value:=l.value),(@prev_objectid:=l.objectid)
from log l,(select @vclock:=0,@prev_value:='',@prev_objectid:=0) b1
where l.clock>UNIX_TIMESTAMP(now()-interval 1 year)
order by l.objectid,l.eventid
) a where a.value='ok'
group by a.objectid
 


objectid    total_time
1            00:00:32

Отредактированно evgeny (04.07.2012 23:36:54)

Неактивен

 

#3 06.07.2012 13:08:57

serious_shat
Участник
Зарегистрирован: 04.07.2012
Сообщений: 2

Re: Запрос для подсчета длительности инцидентов.

evgeny, спасибо за помощь.

Помогите ещё подправить запрос, исходя из уточнённых условий:
- запрос должен отбирать события и считать их длительность для объекта c заданным objectid, например 13492 (в таблице несколько тысяч объектов с уникальными objectid);
- должен учитывать, что статус может меняться с 0 в 1, потом в 2, потом опять в 1 .... и аж потом в 0 (то есть, для событий eventid с 22028 по 22546, длительность = 1337757095 - 1337712527 = 44568 сек).
Вот часть реальной таблицы:
eventid    source    object    objectid    clock    value    acknowledged    ns    value_changed
16486    0    0    13492    1337065152    0    0    367089048    1
16504    0    0    13492    1337067187    1    0    293137732    1
16505    0    0    13492    1337067192    0    0    386697055    1
16707    0    0    13492    1337090357    1    0    817313743    1
16708    0    0    13492    1337090367    0    0    621077743    1
16712    0    0    13492    1337090727    0    0    455654411    0
21602    0    0    13492    1337675272    2    0    706421126    0
21686    0    0    13492    1337679717    0    0    470416763    0
22028    0    0    13492    1337712527    1    0    393417129    1
22043    0    0    13492    1337712809    2    0    773469535    0
22068    0    0    13492    1337712872    1    0    771252927    0
22089    0    0    13492    1337713012    2    0    955808944    0
22104    0    0    13492    1337713079    1    0    404498446    0
22111    0    0    13492    1337713143    2    0    23358744    0
22126    0    0    13492    1337713897    1    0    272713966    0
22128    0    0    13492    1337713959    2    0    368472721    0
22147    0    0    13492    1337715657    1    0    27122582    0
22165    0    0    13492    1337715766    2    0    110087850    0
22187    0    0    13492    1337716587    1    0    283116371    0
22190    0    0    13492    1337716646    2    0    395660360    0
22209    0    0    13492    1337718337    1    0    340331432    0
22212    0    0    13492    1337718398    2    0    120239334    0
22546    0    0    13492    1337757092    0    0    305002491    1
24451    0    0    13492    1337980372    1    0    780941053    1
24453    0    0    13492    1337980412    0    0    584078983    1
где, clock 0 - ок, 1 - problem, 2 - unknown.

Отредактированно serious_shat (06.07.2012 13:10:28)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson