每当贡献者提供更新的价格时,我要使用该报价以及其他报价的最新价格来计算该时刻的总平均价格。
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
只要确保t
按time
适当排序,就可以得到平均值。
根据您对其中一个答案的评论,您试图取每个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