分组后成员的再分组

【问题】

现在有这么一个需求,一个表中记录了各个地点的报警开始时间,结束时间。
现在想统计,各个地点报警次数和时长,时长 = 结束时间 - 开始时间。
要求,同一个地点,开始时间间隔超过 10 分钟的,这个地点要在结果中再出现一次,10 分钟之内的假如有多条,统计条数和报警时长,时长 =10 分钟内各条时长之和。

大家有什么好的思路没。

ID   地点ID     开始时间 结束时间  
1        1        2015/6/8 0:01:00        2015/6/8 0:02:00  
2        1        2015/6/8 0:13:00        2015/6/8 0:14:00  
3        1        2015/6/8 0:14:00        2015/6/8 0:15:00  
4        1        2015/6/8 0:15:00        2015/6/8 0:16:00  
5        2        2015/6/8 0:02:00        2015/6/8 0:03:00  
6        2        2015/6/8 0:06:00        2015/6/8 0:07:00  
7        2        2015/6/8 0:37:00        2015/6/8 0:38:00  

希望结果是:

地点ID  时长次数  
1          1          1  
1          3          3  
2          2          2  
2          1          1

【回答】

这类有序的计算用 SQL 很麻烦,如果是 JAVA+SQL 的环境,用 SPL 写脚本要比 SQL 清晰易懂许多:


A

B

1

$select 地点ID,开始时间,结束时间 from tb order by 地点ID,开始时间

2

=create(地点ID,时长,次数)

3

=A1.group(地点ID)

4

for A3

=A4.开始时间

5


=A4.group(interval@s(B4,开始时间)\600)

6


=A2.insert(0:B5,~.地点ID,~.sum(interval@s(开始时间,结束时间))\60,~.len())


A1:执行 SQL 取数,按地点、开始时间排序

A2:创建目标空结果集

A3:按地点分组,保留分组成员,便于后续计算使用

A4-B6:循环地点分组,B4 取得每组第一个开始时间,B5 通过当前开始时间与第一个开始时间间隔(10 分钟)将成员分组,最后通过 B6 将分组结果写回到 A2 结果序表中。