我的问题是如何编写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.
你的桌子设计有缺陷。你怎么知道哪个 stage1 与哪个 stage2 对应?如果没有办法做到这一点,我认为您的查询是不可能的。
| 归档时间: |
|
| 查看次数: |
12661 次 |
| 最近记录: |