2015-07-22 2 views
1

У меня есть таблица под названием "Билеты", который выглядит следующим образом:Использование DateDiff только один столбец и подмножество конкретных состояний

  • TICKET_ID: INTEGER
  • to_state: VARCHAR (255)
  • update_time: DATETIME БЕЗ ВРЕМЕННОЙ ЗОНЫ - когда билет внесен в_состояние

Чтобы это было просто, вот набор данных для одного билета.

  • 135, тестирование, 9 утра
  • 135, Разработка, 10 утра
  • 135, тестирование 11 утра
  • 135, закрытое, 12 вечера

Я хочу суммировать общее количество времени (в часах), все билеты находятся в состоянии «Тестирование» перед закрытием. Таким образом, в этом примере билет тратит всего 2 часа в состоянии «Тестирование».

Я застрял в том, что метки времени - это всего лишь одна колонка, поэтому, если данный билет находится в «ИСПЫТАНИИ» и «извещается» не один раз, прежде чем он закрыт, я не смог разработать полезную подход.

+0

Вы _really_ должны были помечать этот вопрос чем-то, что указывало бы, что вы застряли в SQL-запросе. –

ответ

0

Это сложно, потому что вы должны получить следующее после каждой записи «Тестирование». Я бы сделал это с коррелированным подзапросом:

select t.ticket_id, 
     sum(timestampdiff(hour, t.next_update_time, t.update_time)) as hours 
from (select t.*, 
      (select t2.update_time 
       from tickets t2 
       where t2.ticket_id = t.ticket_id and 
        t2.to_state <> 'Testing' and 
        t2.update_time > t.update_time 
       order by t2.update_time 
       limit 1 
      ) as next_update_time 
     from tickets t 
     where t.to_state = 'Testing' 
    ) t 
group by t.ticket_id; 
+0

Мне нравится этот подход, я использовал функцию row_number, чтобы иметь возможность ссылаться назад –

0

Хорошие ответы, спасибо. Я сделал следующее, которое, кажется, работает отлично. Благодарим за помощь:

SELECT ROW_NUMBER() OVER(ORDER BY UPDATE_TIME) AS Row, TICKET_ID, TO_STATE, UPDATE_TIME 
INTO #A 
FROM TICKETS 
SELECT ROW_NUMBER() OVER(ORDER BY UPDATE_TIME) AS Row, TICKET_ID, TO_STATE, UPDATE_TIME 
INTO #B 
FROM TICKETS 
SELECT ROW_NUMBER() OVER(ORDER BY UPDATE_TIME) AS Row, TICKET_ID, TO_STATE, UPDATE_TIME 
INTO #A 
FROM TICKETS 
SELECT ROW_NUMBER() OVER(ORDER BY UPDATE_TIME) AS Row, TICKET_ID, TO_STATE, UPDATE_TIME 
INTO #B 
FROM TICKETS 

SELECT SUM(DATEDIFF(MI, #A.UPDATE_TIME, #B.UPDATE_TIME)) AS TOTAL_MINUTES 
FROM #A 
LEFT JOIN #B 
ON #A.ROW=#B.ROW -1 
WHERE #A.TO_STATE='TESTING'