如何在DolphinDB SQL中生成每组从1开始的分组行号
如何在DolphinDB SQL中按分组生成从1开始的行号?
处理股票tick数据时,需要为每个ticker下的交易记录独立编号——AAPL对应1、2、3,MSFT对应1、2,GOOG对应1、2、3,不同分组间编号互不干扰。
示例数据
t = table( `AAPL`AAPL`AAPL`MSFT`MSFT`GOOG`GOOG`GOOG as ticker, 09:30m 09:31m 09:32m 09:30m 09:31m 09:30m 09:31m 09:32m as time, [150, 151, 152, 200, 201, 300, 301, 302] as price )
预期结果
| ticker | time | price | row_num |
|---|---|---|---|
| AAPL | 09:30 | 150 | 1 |
| AAPL | 09:31 | 151 | 2 |
| AAPL | 09:32 | 152 | 3 |
| MSFT | 09:30 | 200 | 1 |
| MSFT | 09:31 | 201 | 2 |
| GOOG | 09:30 | 300 | 1 |
| GOOG | 09:31 | 301 | 2 |
| GOOG | 09:32 | 302 | 3 |
尝试过的无效方法
- 直接使用
rowNo()函数:全局计数,分组间不重置编号
select ticker, time, price, rowNo(ticker) as row_num from t
结果中AAPL得到0、1、2,MSFT从3、4开始,GOOG从5、6、7开始,不符合需求。
- 添加
order by排序:仅调整了记录顺序,但编号仍未按分组重置
select ticker, time, price, rowNo(ticker) as row_num from t order by ticker, time
结果中MSFT的编号还是从3开始,未达到预期。
解决方案
在DolphinDB中,使用rowNo()配合context by可以实现分组内的行号重置,若需要从1开始计数,只需对rowNo()的结果加1即可:
select ticker, time, price, rowNo() + 1 as row_num from t context by ticker order by ticker, time
说明
context by ticker指定按ticker字段分组,rowNo()会在每个分组内从0开始递增计数;- 加1后即可得到从1开始的分组行号;
- 最后通过
order by ticker, time保证每个分组内的记录按时间顺序排列,编号逻辑符合交易时序。
内容的提问来源于stack exchange,提问作者Theobald_z
相关产品推荐
相关产品推荐

