在 SQL 中会话化时序数据
Sessionize time sequence data in SQL
我在SQL中有一些时序数据。我正在尝试 "sessionize" 此数据。当出现大于 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 中一般有什么方法可以做到这一点吗?或者这是不可能的,我需要顺序迭代数据?
当 diff > 10 时,您可以使用 case
表达式指定组的开始。然后使用 运行 sum 对会话标签进行分类。
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 支持 window 功能。
我在SQL中有一些时序数据。我正在尝试 "sessionize" 此数据。当出现大于 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 中一般有什么方法可以做到这一点吗?或者这是不可能的,我需要顺序迭代数据?
当 diff > 10 时,您可以使用 case
表达式指定组的开始。然后使用 运行 sum 对会话标签进行分类。
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 支持 window 功能。