Рассчитать разницу во времени в одном столбце на основе критериев из других столбцов в таблице

0

У меня есть таблица базы данных, которая действует как журнал изменений состояния. Все временные метки указаны в одном столбце. Мне нужно вычислить прошедшее время (в минутах) между конкретными изменениями состояния для каждого "on_id". Как вы можете видеть из моих выборочных данных, я не могу просто вычислить разницу от одной строки до следующей, поскольку между независимыми строками, которые происходят между изменениями статуса для одного "on_id", существуют несвязанные строки.

id          state                 from_state                to_state                   start_time             on_id   user_id 
45   transition_failed      volunteer_to_donor       claimed                  2016-11-28 18:05:59.509807+00      10        53  
 1   transition_completed   drafting                 available                2016-11-10 19:56:16.454458+00       2        12  
 2   transition_failed      available                available                2016-11-10 19:57:01.199609+00       2        12  
 3   transition_failed      available                available                2016-11-10 19:58:08.134549+00       2        12  
28   transition_completed   volunteer_to_donor       volunteer_to_recipient   2016-11-22 22:14:57.060536+00       9        51  
 4   transition_completed   drafting                 available                2016-11-14 16:36:17.802104+00       3        12  
 5   transition_completed   drafting                 available                2016-11-16 14:59:56.925226+00       5        15  
29   transition_failed      volunteer_to_recipient   volunteer_to_donor       2016-11-22 22:51:01.250038+00       9        51  
 6   transition_completed   drafting                 available                2016-11-16 18:04:04.172773+00       6        15  
 7   transition_completed   available                claimed                  2016-11-16 18:05:23.30427+00        6        16  
30   transition_failed      volunteer_to_recipient   volunteer_to_recipient   2016-11-22 22:51:12.458881+00       9        51  
 8   transition_completed   claimed                  volunteer_to_donor       2016-11-16 18:05:28.546312+00       6        16  
 9   transition_completed   volunteer_to_donor       volunteer_to_recipient   2016-11-16 18:05:39.388517+00       6        16  
10   transition_failed      volunteer_to_recipient   volunteer_to_recipient   2016-11-16 18:05:48.772071+00       6        16  
11   transition_completed   volunteer_to_recipient   complete                 2016-11-16 18:06:56.9068+00         6        16  
31   transition_completed   volunteer_to_recipient   complete                 2016-11-22 22:51:38.570253+00       9        51  
12   transition_completed   drafting                 available                2016-11-21 15:11:01.842671+00       7        12  

Я думаю, что мне нужно вычисляемое поле, но я не могу понять синтаксис или функции для использования.

Например, я хотел бы иметь возможность рассчитать прошедшее время для каждого "on_id", чтобы перейти от "доступного" статуса к "заявленному" статусу. Для on_id 6 это заняло 1мин и 19сек.

id          state                 from_state                to_state                   start_time             on_id   user_id 

6   transition_completed   drafting                 available                2016-11-16 18:04:04.172773+00       6        15  
7   transition_completed   available                claimed                  2016-11-16 18:05:23.30427+00        6        16  
  • 0
    обновите свой вопрос, добавьте правильный образец данных и ожидаемый результат
  • 0
    спасибо, я обновил свой вопрос в соответствии с просьбой.
Теги:
tableau
datediff
calculated-field

1 ответ

0

Здесь я создал образец таблицы и sql: надеюсь, что это поможет.

Create table tbl(
  Id int, 
  to_state varchar (10), 
  On_id int,
dte date);

 Insert into tbl values ( 1, 'available', 6, '2018-02-22')
 , ( 2, 'claimed' , 6 , '2018-02-25')
 , ( 3, 'drafted' , 6 , '2018-02-23);

Sql:
Select distinct 
t1.on_id,
t2.availstartdte,
t2.claimstartdte,
datediff(t2.claimstartdte, t2.availstartdte) as date_diff
From tbl t1
Join ( select id, 
      (Select Max(b.dte) from tbl b where b.to_state='available' and a.on_id=b.on_id) as availstartdte,
      (Select Max(b.dte) from tbl b where b.to_state='claimed' and a.on_id=b.on_id) as claimstartdte
      From tbl a
      Where a.to_state in('available', 'claimed')
      ) t2
 On t1.id = t2.id

Результат:

on_id   availstartdte   claimstartdte   date_diff
6             2018-02-22    2018-02-25          3
  • 0
    Спасибо! К сожалению, у меня есть доступ «только для чтения» к базе данных, частью которой является эта таблица. Я мог бы использовать это на экспортируемых данных, но не с живым подключением к базе данных. Можете ли вы придумать способ сделать это без создания новой таблицы?
  • 0
    Я не предлагаю вам создать таблицу. Я иллюстрирую, что мой запрос работает на примере, который вы приводите. Кстати, что вы собираетесь использовать, чтобы вычислить разницу во времени? Excel? Или что-то другое? Ваш тег говорит MySQL, поэтому я использовал MySQL. Кроме того, вы не поставили ожидаемый результат (с колонками). Мне трудно читать твои мысли. Пожалуйста, поймите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню