你没有说你想要答案的 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 阶段之间的差异。这是一个需求问题。