答えが必要なSQLのフレーバーはわかりません。これはおそらく、SQL Serverのコードが必要であることを意味します(SOタグの使用法では[sql]は一般的に[sql-server]として)。
ただし、あなた(または将来のシーカー)が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()
。
編集
このクエリに対する私の見解では、前のステージ3と次のステージ1の差を明示的に計算していません。これは要件の問題です。