Sql ut.我不确定这是否有效…你如何获得stage+1?这似乎得到了阶段之间的间隔…即//阶段1(B)-阶段1(A)。我想问题是如何获得阶段之间的差异(即//stage 2-stage 1)。实际上,这个查询还将为您提供stage 3 stage 1 150。

Sql ut.我不确定这是否有效…你如何获得stage+1?这似乎得到了阶段之间的间隔…即//阶段1(B)-阶段1(A)。我想问题是如何获得阶段之间的差异(即//stage 2-stage 1)。实际上,这个查询还将为您提供stage 3 stage 1 150。,sql,average,Sql,Average,ut.我不确定这是否有效…你如何获得stage+1?这似乎得到了阶段之间的间隔…即//阶段1(B)-阶段1(A)。我想问题是如何获得阶段之间的差异(即//stage 2-stage 1)。实际上,这个查询还将为您提供stage 3 stage 1 150。从需求中不清楚这是否是需要的。我认为不是。谢谢你对我的解决方案发表评论,然后把它偷来声称是你自己的,甚至没有投票给我…@David:Vilx的代码与你的不同(例如,你不使用group by),更好地呈现和解释了。@APC:作者没有指定如何区分哪


ut.我不确定这是否有效…你如何获得stage+1?这似乎得到了阶段之间的间隔…即//阶段1(B)-阶段1(A)。我想问题是如何获得阶段之间的差异(即//stage 2-stage 1)。实际上,这个查询还将为您提供
stage 3 stage 1 150
。从需求中不清楚这是否是需要的。我认为不是。谢谢你对我的解决方案发表评论,然后把它偷来声称是你自己的,甚至没有投票给我…@David:Vilx的代码与你的不同(例如,你不使用group by),更好地呈现和解释了。@APC:作者没有指定如何区分哪个事件发生在哪个事件之后的标准,什么会重新启动“序列”。据我们所知,这是我们想要的。@David-请参阅我对您的解决方案的第二点评论。
event Name    |    Time

stage 1       |    10:01
stage 2       |    10:03
stage 3       |    10:06
stage 1       |    10:10
stage 2       |    10:15
stage 3       |    10:21
stage 1       |    10:22
stage 2       |    10:23
stage 3       |    10:29
(3+6+6)/3 =  5
   Select Avg(e.Time - s.Time)
   From Table s
     Join Table e 
         On e.Time = 
             (Select Min(Time)
              From Table
              Where eventname = s.eventname 
                 And time > s.Time)
         And Not Exists 
             (Select * From Table
              Where eventname = s.eventname 
                 And time < s.Time)
   Select s.EventName,
       s.Time Startime, e.Time EndTime, 
       (e.Time - s.Time) Elapsed
   From Table s
     Join Table e 
         On e.Time = 
             (Select Min(Time)
              From Table
              Where eventname = s.eventname 
                 And time > s.Time)
         And Not Exists 
             (Select * From Table
              Where eventname = s.eventname 
                 And time < s.Time)
WITH    q AS
        (
        SELECT  'stage 1' AS eventname, CAST('2009-01-01 10:01:00' AS DATETIME) AS eventtime
        UNION ALL
        SELECT  'stage 2' AS eventname, CAST('2009-01-01 10:03:00' AS DATETIME) AS eventtime
        UNION ALL
        SELECT  'stage 3' AS eventname, CAST('2009-01-01 10:06:00' AS DATETIME) AS eventtime
        UNION ALL
        SELECT  'stage 1' AS eventname, CAST('2009-01-01 10:10:00' AS DATETIME) AS eventtime
        UNION ALL
        SELECT  'stage 2' AS eventname, CAST('2009-01-01 10:15:00' AS DATETIME) AS eventtime
        UNION ALL
        SELECT  'stage 3' AS eventname, CAST('2009-01-01 10:21:00' AS DATETIME) AS eventtime
        UNION ALL
        SELECT  'stage 1' AS eventname, CAST('2009-01-01 10:22:00' AS DATETIME) AS eventtime
        UNION ALL
        SELECT  'stage 2' AS eventname, CAST('2009-01-01 10:23:00' AS DATETIME) AS eventtime
        UNION ALL
        SELECT  'stage 3' AS eventname, CAST('2009-01-01 10:29:00' AS DATETIME) AS eventtime
        )
SELECT  (
        SELECT  AVG(DATEDIFF(minute, '2009-01-01', eventtime))
        FROM    q
        WHERE   eventname = 'stage 3'
        ) - 
        (
        SELECT  AVG(DATEDIFF(minute, '2009-01-01', eventtime))
        FROM    q
        WHERE   eventname = 'stage 2'
        )
Select Avg(differ) from (
 Select s1.r, s2.r, s2.time - s1.time as differ from (
 Select * From (Select rownum as r, inn.time from table inn order by time) s1
 Join (Select rownum as r, inn.time from table inn order by time) s2
 On mod(s2.r, 3) = 2 and s2.r = s1.r + 1
 Where mod(s1.r, 3) = 1)
);
select a.eventName, b.eventName, AVG(DATEDIFF(MINUTE, a.[Time], b.[Time])) as Average from
     (select *, row_number() over (order by [time]) rn from events) a
join (select *, row_number() over (order by [time]) rn from events) b on (a.rn=b.rn-1)
group by
a.eventName, b.eventName
stage3  stage1  2
stage1  stage2  2
stage2  stage3  5

event Name    |    Time

stage 1       |    10:01
stage 2       |    10:03
stage 3       |    10:06
stage 1       |    10:10
stage 2       |    10:15
stage 3       |    10:21
stage 1       |    10:22
stage 2       |    10:23
stage 1       |    10:25     --- new stage 1
stage 2       |    10:28     --- new stage 2
stage 3       |    10:29
stage 3       |    10:34     --- new stage 3
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>