可以嵌套查询,示例如下,其中deltas是求相邻元素之差:
t=table(1 2 3 7 0 1 3 6 8 0 5 as cl) select sum(delta) from (select deltas(cl) as delta from t) where delta>0
在计算1 2 3 7 0 1 3 6 8 0 5时,两个0之间的序列一定是单调递增序列,逻辑等同于计算(7-1) + (8-0) + (5-0),等同于(7+8) -1 + 5,等同于计算(所有0之前的数字之和)- (第一个数字)+ (最后一个数字)
res = t[next(t.cl)==0].cl.sum() - t.cl.first() + t.cl.last()
性能对比:
cl_list = (1..1000000).append!(0) for(i in 1..9) { cl_list.append!((1..1000000).append!(0)) } t=table(cl_list as cl) timer exec sum(delta) from ( select deltas(cl) as delta from t) where delta>0 // 86 ms timer res = t[next(t.cl)==0].cl.sum() - t.cl.first() + t.cl.last() // 35 ms