需求場景:讀取期貨5分鍾數據表,判斷每日各個品種的主次合約
解決方案:只要根據每日第一個5分鍾線的持倉量排序就能獲取當日主次合約
代碼實現:根據日期(精確到日)、品種進行分組,在每個分組中按照日期(精確到分鍾)、持倉量排序,取排序前面2行的合約則為主次合約。
原始數據

實現
- 新增需要的列
首先簡單增加一個排序列以及日期 看看效果
set @order_num = 0;
select *,convert(Date, date) as Day,@order_num:=@order_num+1 rownum from 2021_05 order by productid,Date,openinterest desc

- 按product分組的排序
set @order_num = 0;
set @product= '';
select *,convert(Date, date) as Day,case when @product=ProductID then @order_num:=@order_num+1 else @order_num:=1 end rownum,@product:=ProductID from 2021_05 order by productid,Date,openinterest desc

- 按product,day分組的排序,取前面2條數據
set @order_num = 0;
set @product= '';
set @day='';
select Day,ProductID,InstrumentID from
(select *,case when @product=ProductID and @day=Day then @order_num:=@order_num+1 else @order_num:=1 end rownum,@product:=ProductID,@day:=Day from
(select a.*,b.Day from 2021_05 a inner join (select id,convert(Date, date) as Day from 2021_05)b on a.id=b.id)c
order by productid,Date,openinterest desc)d
where rownum<=2

小結
性能方面還有很大優化空間 后續再繼續修改
