优化KDB查询时间以获得每个贡献者的滚动平均价格



每当贡献者提供更新的价格时,我要使用该报价以及其他报价的最新价格来计算该时刻的总平均价格。

t:`time xasc flip (`userID`time`price)!(`quote1`quote2`quote3`quote3`quote3`quote3`quote4`quote2`quote4`quote3`quote2`quote3`quote1`quote3`quote4`quote1`quote4`quote2`quote2`quote4;(21:11:37 03:13:29 15:35:39 09:59:13 04:34:15 13:09:01 21:21:55 16:54:39 04:03:04 18:22:39 17:05:44 05:08:40 07:35:50 15:46:15 17:32:29 19:42:47 03:28:48 04:20:03 14:16:55 09:02:12);86.4 84.4 54.26 7.76 63.75 97.61 53.97 71.63 38.86 52.23 87.25 65.69 96.25 37.15 17.45 58.97 95.51 61.59 70.25 35.5)

期望输出低于

delete userIDPriceList,userIDComps from t,'raze {[idx;tab] select avgPrice:avg price, userIDPriceList:price,userIDComps:userID from select last price by userID from t where i <= idx}[;t] each  til count t

最终输出不需要userIDPriceList,userIDComps

性能较慢,正在寻找更好的计算方法。

q) t do[200000;delete userIDPriceList,userIdComps from t,'raze {[idx;tab] select avgPrice:avg price, userIDPriceList:price,userIDComps:userID from select last price by userID from t where i <= idx}[;t] each  til count t]
10152j

Thanks in advance

根据您明确的需求,另一种方法是使用scan进行累积:

update avgPrice:avg each{x,(1#y)!1#z}[();userID;price] from t
如果数据是静态的,Igors的解决方案会更快(也就是说,你可以用这个属性准备一次表)。

下面的代码给出了给定userID之前所有价格的平均值,包括当前行:

ungroup 0!select time, price, avgPrice: avgs price by userID from t

只要确保ttime适当排序,就可以得到平均值。

根据您对其中一个答案的评论,您试图取每个userID在记录时间的平均价格,而忽略任何未来的记录。

这个查询将做的就是:

select userID,time,price,avgPrice:(avgs;price)fby userID from t

你的查询(delete userIDPriceList ...)的结果与@Anton Dovzhenko在他对你最初问题的评论中指出的不同。

看了你的评论后,我认为我理解你的要求。也许你可以这样做。

prices:exec `s#time!price by userID from t;
update avgPrice:avg each flip prices[;time] from t

相关内容

  • 没有找到相关文章

最新更新