查询以计算连续事件之间的平均时间

Tsi*_*ion 6 sql average

我的问题是如何编写SQL查询来计算连续事件之间的平均时间.

我有一张小桌子:

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
Run Code Online (Sandbox Code Playgroud)

我想构建一个查询,它将阶段(i)和阶段(i + 1)之间的平均时间作为答案.

例如,第2阶段和第3阶段之间的平均时间是5:

(3+6+6)/3 =  5
Run Code Online (Sandbox Code Playgroud)

Vil*_*lx- 13

Aaaaand撒上黑魔法:

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
Run Code Online (Sandbox Code Playgroud)

这将为您提供如下行:

stage3  stage1  2
stage1  stage2  2
stage2  stage3  5
Run Code Online (Sandbox Code Playgroud)

第一列是起始事件,第二列是结束事件.如果在事件1之后有事件3,那么也会列出.否则,您应该提供一个关于哪个阶段遵循哪个阶段的标准,因此仅在这些阶段之间计算时间.

补充:这在Transact-SQL(MSSQL,Sybase)和PL/SQL(Oracle,PostgreSQL)上都可以正常工作.但是我没有测试它,仍然可能存在语法错误.这不适用于任何版本的MySQL.


HLG*_*GEM 1

你的桌子设计有缺陷。你怎么知道哪个 stage1 与哪个 stage2 对应?如果没有办法做到这一点,我认为您的查询是不可能的。

  • HLGEM 有道理。我们必须假设这是一个序列化进程 - 也就是说,当阶段 3 运行时,阶段 1 永远无法启动。但在现实生活中,大多数进程都是多线程/多用户,因此我们需要一个额外的标识符来隔离流。 (2认同)