2024-07-31 更新
新一代服务器与测试服务器,以及两个客户端版本中,已优化了该问题。
即,使用t:= select *,PercentRankOf(["A"],["A"]) as 'PR' from t end 方式不再存在效率问题。
FAQ:
2024-07-31新一代客户端升级
2024-07-31 之前
问题描述:计算排位百分点,一般我们想到的模型是PercentRankOf,它在计算指定值在整个序列中的排位时比较方便,且不需要额外的排名操作。
但是当需要计算的数量超过一定,如5000个排位百分点时,就会显的非常慢。
原因是,该模型在计算时,是临时排名然后计算指定值在整个序列中排位的百分点,如计算100个数据点,则需要将整个过程重复100次,因此,在这种情景中效率非常低下。
此时,我们应该转换成下面这种用法:
1、对序列进行整体排序
2、通过排名计算排位比例
如:计算指定日所有A股的市值排位百分点
EndT:=20240726T;
codes:=getabkbydate('上证A股;深证A股;中小企业板;创业板;科创板', EndT);
codes:=select thisrow as 'code',spec(StockTotalValue(EndT),thisrow) as 'mv' from codes end;
len:=length(codes);
t:=select ['code'],['mv'],
(thisorder-1)/(Len-1) as 'mvrank' from codes order by ["mv"] end;
return t;
效率说明:上述操作,order by后做(thisorder-1)/(Len-1) as 'mvrank'操作,该计算过程一般能在1秒内完成,而使用percentrankof(['mv'],['mv']) as 'mvrank'则至少在5秒以上,甚至更长时间。