查找时间序列的运行总和高于给定阈值的位置

Cod*_*123 2 sql oracle oracle11g

我有一些时间序列数据.例如,查看以下值(假设这里的时间是几分钟):

User Time Value
a   0      10
b   1      100
c   2      200
a   3      5
e   4      7
a   5      999
a   6      8
b   7      10
a   8      10
a   9      10
a   10     10
a   11     10
a   12     100
Run Code Online (Sandbox Code Playgroud)

现在我想知道在任何给定的5分钟间隔内是否达到了超过1000的总和.

例如,在上面的示例中,我应该得到一个输出,例如用户a,分钟5,6,8,9.

dno*_*eth 5

对于Window Function来说,这是一项简单的任务:

select *
from 
 (
   select t.*
     ,sum("Value") -- cumulative sum over the previous five minutes
      over (partition by "user"
            order by "Time"
            range 4 preceding) as sum_5_minutes
   from Table1 t
 ) dt
where sum_5_minutes > 1000
Run Code Online (Sandbox Code Playgroud)

小提琴

编辑:SQLFiddle再次脱机,但您也可以在接下来的5分钟内搜索.

Edit2:SQLFiddle脱机,但如果数据类型是a TimeStampDate你必须使用interval而不是整数:

select *
from 
 (
  select t.*
     ,sum("Value") 
      over (partition by "User"
            order by "Time"
            range interval '4' minute preceding) as sum_prev5_minutes
      ,sum("Value") 
      over (partition by "User"
            order by "Time"
            range between interval '0' minute preceding -- or "current row" if there are no duplicate timestamps
            and interval '4' minute following) as sum_next5_minutes

   from Table1 t
 ) dt
where sum_prev5_minutes > 1000 
   or sum_next5_minutes > 1000
Run Code Online (Sandbox Code Playgroud)