相邻状态分组统计时间间隔

【问题】

obj_id      obj_date                 value
1     2015-07-30 15:00:00.000  1
1     2015-07-30 15:02:00.000  1
1     2015-07-30 15:04:00.000  1
1     2015-07-30 15:06:00.000  0
1     2015-07-30 15:08:00.000  0
1     2015-07-30 15:10:00.000  1
1     2015-07-30 15:20:00.000  0
2     2015-07-30 15:02:00.000  1
value
第一次出现1开始累计到value=0为止,如果0一直没有出现,就和系统时间比。
现在系统时间比如说是15:30
结果
id       
开始时间                                累计时间
1        2015-07-30 15:00:00.000             6
1        2015-07-30 15:10:00.000             10
2        2015-07-30 15:02:00.000             28 

【回答】

       按相邻成员的value分组,取每两组的首条记录即可获取开始时间和计算时长,SQL搞这些序运算很难懂,数据量不大时读出来用SPL比较简单:


A

1

$select * from tb order by   obj_id,obj_date

2

=A1.group(obj_id).(~.group@o1(value)|[null])

3

=A2.news(~.len()\2;A2.~.obj_id:id,(s=A2.~(#*2-1).obj_date):开始时间, interval@s(s,ifn(A2.~(#*2).obj_date,now()))/60:累计时间)

A1sql取数,按照obj_id,obj_date排序

A2:按照obj_id分组,并在每组里按照相邻value同值再合并分组,取每个小组第一条记录,为了后续计算方便,每大组补足一个null

A3:取每组奇数行的obj_date为开始时间,取对应偶数行的obj_date为结束时间来计算间隔时长,如果对应偶数行为null,则取当前系统时间为结束时间来计算间隔时长

写好的脚本如何在应用程序中调用,可以参考Java 如何调用 SPL 脚本