SPL 计算设备开关机时长

 

业务需求
数据库中有设备状态表,包含数据创建时间、设备名称,
当前状态(1.0 为开机,0.0 为关机)等字段,如下图

t1png

需要统计各个设备每天的开机时长和关机时长,如下表格

t2png

数据规则
当天第一条记录状态决定 0 点到该时间点的状态,之后根据上一个时间点的状态作为上一个时间点到当前时间段的状态,当天最后一个时间点的状态作为到当天结束这个时间段。
这种情况下很难通过 sql 实现,在 SPL 中很容易实现数据的计算与统计。
SPL 方案
spl 脚本计算的结果可提供给报表和仪表板使用。
该应用场景 spl 脚本的编写逻辑如下:
1、查询数据按设备名称和时间字段排序。
2、创建一个空的序表,用于存放结果数据,含设备名称、日期、开机时长、关机时长字段。
3、先将查询回来的数据按照设备名称和将 create_time 获取的日期(不带时间)进行分组
4、然后循环分组计算每个分组的开机时长和关机时长;
a) 每个分组计算先初始化时间为 0 点 0 分 0 秒,状态为 null。
b) 然后将结果序表 insert 一条当前设备当前日期的记录,开机时长和关机时长为 0.
c) 循环分组内的数据,将时长增加到结果序表最后一条记录的开机时长或关机时长字段。
i. 如果是第一条记录,根据记录的状态判断 0 点到该记录的当前时间点的时长是开机时长还是关机时长;
ii. 从第二条记录开始就按照上一条记录的状态判断是开机时长段还是关机时长;
d) 将最后一条记录根据状态计算该记录时间和当天结束时间作为开机时长或关机时长。将时长增加到结果序表最后一条记录的开机时
长或关机时长字段。
5、返回结果序表即可供报表或仪表板使用。

Spl 脚本如下图:

t3png