在DolphinDB中按组计算两行差值及多列计算优化问询
DolphinDB分组聚合:按条件取最新值或最新两行差值
一、用GROUP BY实现需求逻辑
你可以直接通过GROUP BY结合聚合函数完成需求,核心是利用last()获取每组最新记录的字段值,prevLast()获取倒数第二条记录的字段值,再通过iif()判断逻辑返回对应结果,代码如下:
result = select date, order_book_id, iif(last(Q) == 1, last(revenue), last(revenue) - prevLast(revenue)) as revenue from tmp group by date, order_book_id;
说明:
last(Q):获取每组最后一条记录的Q值,判断是否触发“返回最新记录”的逻辑;last(revenue):每组最新的revenue值;prevLast(revenue):每组倒数第二条的revenue值,两者差值即为最新两行的差;- 该写法语义更贴合聚合操作的定义,和你原有的
context by + limit -1方案效率相当,均为向量化计算。
另外你原代码中order by order_book_id asc属于冗余逻辑,因为context by date, order_book_id已经完成分组,若需确保最新行在组内末尾,建议按时间类字段(如数据中存在的交易时间戳)排序。
二、多列处理:避免重复编写iif条件
当需要对多列(如revenue1、revenue2等)执行相同逻辑时,可通过元编程或自定义聚合函数简化代码:
方法1:元编程动态生成查询表达式
先定义需要处理的列列表,再批量生成处理逻辑,最后通过sqlSelect构建查询:
# 定义需要处理的列 targetCols = [`revenue1, `revenue2, `revenue3] # 批量生成每个列的处理表达式 exprList = targetCols.map(col -> iif(last(Q) == 1, last(col), last(col) - prevLast(col)) as col) # 构建并执行查询 result = sqlSelect( date, order_book_id, *exprList ).from(tmp).groupBy(date, order_book_id).eval()
方法2:自定义聚合函数
将固定逻辑封装成自定义聚合函数,后续直接调用即可:
# 定义自定义聚合函数 def aggByQ(qCol, valCol) { qLatest = last(qCol) valLatest = last(valCol) return valLatest if qLatest == 1 else valLatest - prevLast(valCol) } # 调用函数处理多列 result = select date, order_book_id, aggByQ(Q, revenue1) as revenue1, aggByQ(Q, revenue2) as revenue2, aggByQ(Q, revenue3) as revenue3 from tmp group by date, order_book_id;
如果仍偏好context by的写法,同样可以用元编程批量生成列处理逻辑,避免重复编写iif。
内容的提问来源于stack exchange,提问作者Polly
相关产品推荐
相关产品推荐

