У меня есть таблица базы данных, которая действует как журнал изменений состояния. Все временные метки указаны в одном столбце. Мне нужно вычислить прошедшее время (в минутах) между конкретными изменениями состояния для каждого "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
Здесь я создал образец таблицы и 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