2017-07-18 41 views
0

我在SQL中有一些时间序列数据。我试图“会话”这些数据。当发生大于n个时间单位的休息时,发生新的会话。在SQL中会话化时间序列数据

输入在CSV形式:

Time, TimeDiffFromLast 
0,0 
1,1 
2,1 
17,15 
18,1 
19,1 
32,13 
33,1 
34,1 

对于这个例子,如果从最后一行的时间差超过n = 10个时间单位较大的一个新的会话应该被创建。

在CSV形式

所需的输出:

Time, TimeDiffFromLast, SessionLabel 
0,0,a 
1,1,a 
2,1,a 
17,15,b 
18,1,b 
19,1,b 
32,13,c 
33,1,c 
34,1,c 

有什么办法,一般要做到这一点的SQL?或者这是不可能的,我需要顺序迭代数据?

+0

会话标签应该是字母吗?或者他们也可以是数字? –

+0

对于SessionLabel字段,任何唯一标签都可以。例如,Int可能对我来说是理想的。 – AetherMass

回答

1

当diff> 10时,您可以使用case表达式指定组的开始。然后使用运行总和来分类会话标签。

select time,diff_from_last,sum(col) over(order by time) as session_label 
from (
select time, time-lag(time,1,time) over(order by time) as diff_from_last, 
case when time-lag(time,1,time) over(order by time) > 10 then 1 else 0 end as col 
from tbl 
) t 

这里假设你正在使用的dbms支持窗口函数。

+0

我在Apache Spark SQL中。我很惊讶你的上面的查询完全按照上面的方式工作。我预计一些语法会丢失。与滞后和案例功能很好的工作。我会阅读这些部分。 – AetherMass