如何在分组聚合中获取 array vector 字段的最后一个元素,或者把 array vector 列聚合成一行

请教,  select last(BuyPrice) from t1 group by interval(Tradetime,15s, 'prev') , 如果 BuyPrice 列是 array vector 的话, 会报错。有什么办法可以解决这种需求?

看到文档中可以用 select toArray(BuyPrice) from t1 group by interval(Tradetime,15s,'prev') 解决. 然而如果BuyPrice是一个不定长的 Array Vector, 依旧会报错。


请先 登录 后评论

1 个回答

Polly

我测试了一下是因为您的 array vector 有空元素,而 interval 指定了 fill 方法,调用的是内置的 ffill 函数,目前 fill 空值的函数不支持 array vector 数据形式,所以会报错。

目前解决方案是把空值手动填个 0 或者什么标志元素进去,然后调用 interval,之后再过滤。需要注意 array vector 字段的更新必须是整列,更新较为麻烦,可以参考下述脚本:

bid = array(DOUBLE[], 0, 20).append!([1.479 1.4787 1.4784 1.4667, 1.4796 1.479 1.4782 1.4781 1.4783, 1.4791 1.4785 1.4698 1.4720, 1.4699 1.469 1.4707 1.4704 1.4697, 1.4789 1.477 1.4780])
bidSize = array(INT[], 0, 20).append!([[], 100 200 200 300 0, 100 200 100 0, 0 100 200 0 300, 100 0 0])
TradeDate = 2022.01.01T10:00:00 + [1, 4, 12, 19, 21]
SecurityID = rand(`APPL`AMZN`IBM, 5)
t1 = table(SecurityID as `sid, TradeDate as `date, bid as `bid, bidSize as `bidSize)
tmp = exec bidSize from t1

bidSize1=each(def(mutable x)->iif(x.count()==0, [0], x), tmp)
newBidSize=array(INT[]).append!(bidSize1)

update t1 set bidSize=newBidSize
请先 登录 后评论