Mysql實現分組之后組內排序取前N名


需求場景:讀取期貨5分鍾數據表,判斷每日各個品種的主次合約

解決方案:只要根據每日第一個5分鍾線的持倉量排序就能獲取當日主次合約

代碼實現:根據日期(精確到日)、品種進行分組,在每個分組中按照日期(精確到分鍾)、持倉量排序,取排序前面2行的合約則為主次合約。

原始數據

實現

  1. 新增需要的列

首先簡單增加一個排序列以及日期 看看效果

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

  1. 按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

  1. 按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

小結

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM