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.
对于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 TimeStamp或Date你必须使用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)