相邻状态分组统计时间间隔
【问题】
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:累计时间) |
A1:sql取数,按照obj_id,obj_date排序
A2:按照obj_id分组,并在每组里按照相邻value同值再合并分组,取每个小组第一条记录,为了后续计算方便,每大组补足一个null
A3:取每组奇数行的obj_date为开始时间,取对应偶数行的obj_date为结束时间来计算间隔时长,如果对应偶数行为null,则取当前系统时间为结束时间来计算间隔时长
写好的脚本如何在应用程序中调用,可以参考Java 如何调用 SPL 脚本