如何基于列值变化分组计算DolphinDB中分组内累积最小值?
问题描述
我们有如下模拟数据表:
time = [09:00:00, 09:00:01, 09:00:02, 09:00:03, 09:00:04, 09:00:05, 09:00:06, 09:00:07, 09:00:08] b = [101, 103, 105, 110, 129, 134, 123, 111, 120] a = [100, 100, 100, 200, 200, 300, 200, 200, 100] t = table(time, b, a) // t: time b a -------- --- --- 09:00:00 101 100 09:00:01 103 100 09:00:02 105 100 09:00:03 110 200 09:00:04 129 200 09:00:05 134 300 09:00:06 123 200 09:00:07 111 200 09:00:08 120 100
需要以a列的连续相同值作为分组(比如连续3个100为一组,连续2个200为另一组,以此类推),在每个分组内计算b列的累积最小值,预期结果如下:
time b a cummin_b -------- --- --- --------- 09:00:00 101 100 101 09:00:01 103 100 101 09:00:02 105 100 101 09:00:03 110 200 110 09:00:04 129 200 110 09:00:05 134 300 134 09:00:06 123 200 123 09:00:07 111 200 111 09:00:08 120 100 120
请问如何编写DolphinDB SQL脚本实现该功能?
解决方案
可以利用DolphinDB的rleid函数生成连续相同值的分组ID,再结合cummin函数按分组计算累积最小值,脚本如下:
// 生成连续值分组ID t = update t, groupId = rleid(a) // 按分组计算b列的累积最小值 result = select time, b, a, cummin(b) as cummin_b from t context by groupId // 查看最终结果 select * from result
关键函数说明
rleid(a):对a列中连续的相同值生成唯一分组ID,当a的值发生变化时ID自动递增,恰好满足连续值分组的需求。cummin(b) context by groupId:在每个groupId对应的分组内,计算b列从当前分组首行到当前行的累积最小值。
执行上述脚本后,即可得到预期的结果。
内容的提问来源于stack exchange,提问作者Stella.W
相关产品推荐
相关产品推荐

