Вы не говорите, для какой разновидности SQL вы хотите получить ответ. Это, вероятно, означает, что вам нужен код в SQL Server (как [sql] обычно = [sql-server] в использовании тега SO).
Но на тот случай, если вы (или какой-то будущий искатель) используете Oracle, этот тип запроса довольно прост с аналитическими функциями, в данном случае LAG()
. Проверьте это:
SQL> select stage_range
2 , avg(time_diff)/60 as average_time_diff_in_min
3 from
4 (
5 select event_name
6 , case when event_name = 'stage 2' then 'stage 1 to 2'
7 when event_name = 'stage 3' then 'stage 2 to 3'
8 else '!!!' end as stage_range
9 , stage_secs - lag(stage_secs)
10 over (order by ts, event_name) as time_diff
11 from
12 ( select event_name
13 , ts
14 , to_number(to_char(ts, 'sssss')) as stage_secs
15 from timings )
16 )
17 where event_name in ('stage 2','stage 3')
18 group by stage_range
19 /
STAGE_RANGE AVERAGE_TIME_DIFF_IN_MIN
------------ ------------------------
stage 1 to 2 2.66666667
stage 2 to 3 5
SQL>
Изменение формата во внутреннем запросе необходимо, потому что я сохранил столбец TIME как тип данных DATE, поэтому я преобразовал его в секунды, чтобы сделать математику более понятной. Альтернативным решением было бы работать с Day to Second Interval
типом данных. Но это решение действительно о LAG()
.
1012 * редактировать *
В моем рассмотрении этого запроса я явно не рассчитал разницу между предыдущим этапом 3 и последующим этапом 1. Это является требованием.