分组后成员的再分组
【问题】
现在有这么一个需求,一个表中记录了各个地点的报警开始时间,结束时间。
现在想统计,各个地点报警次数和时长,时长 = 结束时间 - 开始时间。
要求,同一个地点,开始时间间隔超过 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 结果序表中。