我在SQL中有一些时间序列数据。我试图“会话化”这些数据。当大于n个时间单位的中断发生时,会发生新会话。
以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 :(得分:1)
当diff>时,您可以使用case
表达式指定组的开头。 10.然后使用运行总和对会话标签进行分类。
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支持窗口函数。