2016-07-25 11 views
0

У меня есть данные в следующем виде:Как рассчитать время разрешения в MySQL?

TicketID Status Datetime 
25   Open  2016-07-21 11:46:40 
25   Open  2016-07-22 09:42:40 
25   Closed 2016-07-22 09:46:40 
25   Open  2016-07-23 08:42:40 
25   Open  2016-07-24 08:46:40 
25   Open  2016-07-24 09:26:40 
25   Closed 2016-07-25 11:46:40 

Я хочу, чтобы вычислить следующее:

((2016-07-22 09:46:40 - 2016-07-21 11:46: 40) + (2016-07-25 11:46:40 - 2016-07-23 08:42:40))/2.

+0

Я не думаю, что ваши расчеты верны. Первое значение - «0». –

+0

Вы пытаетесь рассчитать за билет среднее время, необходимое для их завершения? Если каждый билет можно открывать и закрывать несколько раз под одним и тем же идентификатором. Как говорит @GordonLinoff, ваш расчет кажется неправильным (возможно, это просто опечатка). Я предполагаю, что это должно быть: '(('2016-06-22 09:46:40' - '2016-06-21 11:46:40') + ('2016-07-25 11:46:40' - '2016-06-23 08:42:40'))/2' –

ответ

1

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

select close_datetime, min(datetime) as open_datetime 
from (select t.*, 
      (select t2.DateTime 
       from t t2 
       where t2.status = 'Closed' and t2.DateTime > t.DateTime 
      ) as close_datetime 
     from t 
     where status = 'Open' 
    ) t 
group by close_datetime; 

Вы можете получить сумму различий. Это значение получает за считанные секунды:

select sum(timestampdiff(second, clsoe_datetime, open_datetime) as num_seconds 
from (select close_datetime, min(datetime) as open_datetime 
     from (select t.*, 
        (select t2.DateTime 
        from t t2 
        where t2.status = 'Closed' and t2.DateTime > t.DateTime 
        ) as close_datetime 
      from t 
      where status = 'Open' 
      ) t 
     group by close_datetime 
    ) t 
+0

Проверьте мой ответ тоже! – MontyPython

0

Это похоже на меня.

set @x=now(), @y=-1; 

select 
    avg(timestampdiff(second,prev_stat_dt,curr_stat_dt)) 
from 
    (select 
     TicketID, 
      @y prev_stat, 
      @y:=Status curr_stat, 
      @x prev_stat_dt, 
      @x:=DateTime curr_stat_dt 
    from 
     table1 
    where 
      Status in ('Open' , 'Closed')) t 
where 
    prev_stat = 'Open' and curr_stat = 'Closed'; 
+0

Назначение переменных в отдельных выражениях не гарантируется. MySQL не гарантирует порядок оценки выражений в 'SELECT', поэтому четыре назначения могут быть в любом порядке. –

+0

Невозможно сделать вывод/отставание в MySQL? @GordonLinoff – MontyPython

+0

Да, но это немного сложно с переменными. –