我有一系列值来指定作业的状态,无论是成功还是失败。
系列中的每个项目都有一个类型,也有一个分组ID。它是一个依赖序列,因此如果作业bar
成功,将会运行ID A
的作业foo
。
idx time id type status
1 2018-01-01T00:00:00 A foo success
2 2018-01-01T01:00:00 A bar success
3 2018-01-02T00:00:00 B foo success
4 2018-01-02T02:00:00 B bar success
5 2018-01-03T00:00:00 C foo success
6 2018-01-03T03:00:00 C bar success
7 2018-01-04T00:00:00 D foo success
8 2018-01-04T01:00:00 D bar success
9 2018-01-05T00:00:00 E foo success
10 2018-01-05T01:00:00 E bar success
11 2018-01-06T00:00:00 F foo failure
12 2018-01-07T00:00:00 G foo failure
13 2018-01-08T00:00:00 H foo recovery
14 2018-01-08T03:00:00 H bar success
15 2018-01-09T00:00:00 I foo failure
16 2018-01-10T00:00:00 J foo failure
17 2018-01-11T00:00:00 K foo recovery
18 2018-01-11T03:00:00 K bar success
我需要计算每个作业类型的依赖作业和恢复时间之间的时间。
对于上述数据,依赖作业系列之间的时间将为:
恢复时间系列将是:
我已经使用elapsed()
和difference()
聚合来获得我需要的东西,但它似乎不够优雅。
有关恢复时间系列:
我添加了成功"值为我的点,整数指定为"成功"或"恢复",0为"失败"。
我在其上使用difference()
来确定该点是新故障(-1),重复先前状态(0)还是恢复(+1)。过滤掉零值会给我带来失败和恢复。
elapsed()
给出了故障和恢复之间的时间,以及恢复和下一次故障。这些可以通过将cumulative_sum()
差异成功添加到最终系列来区分(-1是失败; 0是恢复)然后仅过滤恢复。
SELECT elapsed FROM (
SELECT elapsed(diff) as elapsed, cumulative_sum(diff) as csum FROM (
SELECT diff from (
SELECT difference(success) AS diff FROM test WHERE type = 'foo'
) WHERE diff != 0
)
) WHERE csum = 0
上述数据集的结果:
time elapsed
---- -------
2018-01-08T00:00:00Z 172800000000000
2018-01-11T00:00:00Z 172800000000000
关于从属工作系列之间的时间:
这可以通过相同的技巧完成,添加一个指定作业类型的整数值。如果bar
,则type = 'bar'
下面的值为1,否则为0。
SELECT elapsed FROM (
SELECT elapsed(success) as elapsed, difference(bar) as diff
FROM test WHERE type='bar' OR (type='foo' AND success=1)
) WHERE diff = 1
上述数据集的结果:
time elapsed
---- -------
2018-01-01T01:00:00Z 3600000000000
2018-01-02T02:00:00Z 7200000000000
2018-01-03T03:00:00Z 10800000000000
2018-01-04T01:00:00Z 3600000000000
2018-01-05T01:00:00Z 3600000000000
2018-01-08T03:00:00Z 10800000000000
2018-01-11T03:00:00Z 10800000000000
有更好的方法吗?要么完全不同的策略,要么不必将所有这些整数值添加到我的点,例如将difference()
应用于计算字段?
大多数复杂性来自于尝试从系列中选择其他所有点。有没有更好的方法呢?